@warlock.js/cascade 5.31.0 → 5.33.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 (230) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/cjs/index.cjs +104 -85
  3. package/cjs/index.cjs.map +1 -1
  4. package/esm/context/database-data-source-context.d.mts +2 -3
  5. package/esm/context/database-data-source-context.d.mts.map +1 -1
  6. package/esm/context/database-transaction-context.d.mts +2 -3
  7. package/esm/context/database-transaction-context.d.mts.map +1 -1
  8. package/esm/contracts/database-driver.contract.d.mts +56 -36
  9. package/esm/contracts/database-driver.contract.d.mts.map +1 -1
  10. package/esm/contracts/database-id-generator.contract.d.mts +7 -5
  11. package/esm/contracts/database-id-generator.contract.d.mts.map +1 -1
  12. package/esm/contracts/database-remover.contract.d.mts +3 -5
  13. package/esm/contracts/database-remover.contract.d.mts.map +1 -1
  14. package/esm/contracts/database-restorer.contract.d.mts +6 -6
  15. package/esm/contracts/database-restorer.contract.d.mts.map +1 -1
  16. package/esm/contracts/database-writer.contract.d.mts +4 -6
  17. package/esm/contracts/database-writer.contract.d.mts.map +1 -1
  18. package/esm/contracts/driver-blueprint.contract.d.mts +2 -3
  19. package/esm/contracts/driver-blueprint.contract.d.mts.map +1 -1
  20. package/esm/contracts/index.d.mts +2 -1
  21. package/esm/contracts/migration-driver.contract.d.mts +101 -53
  22. package/esm/contracts/migration-driver.contract.d.mts.map +1 -1
  23. package/esm/contracts/query-builder.contract.d.mts +51 -33
  24. package/esm/contracts/query-builder.contract.d.mts.map +1 -1
  25. package/esm/contracts/sync-adapter.contract.d.mts +25 -14
  26. package/esm/contracts/sync-adapter.contract.d.mts.map +1 -1
  27. package/esm/data-source/data-source-registry.d.mts +4 -5
  28. package/esm/data-source/data-source-registry.d.mts.map +1 -1
  29. package/esm/data-source/data-source.d.mts +8 -5
  30. package/esm/data-source/data-source.d.mts.map +1 -1
  31. package/esm/database-dirty-tracker.d.mts +2 -2
  32. package/esm/database-dirty-tracker.d.mts.map +1 -1
  33. package/esm/database-dirty-tracker.mjs +3 -2
  34. package/esm/database-dirty-tracker.mjs.map +1 -1
  35. package/esm/drivers/mongodb/mongodb-driver.d.mts +3 -4
  36. package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
  37. package/esm/drivers/mongodb/mongodb-id-generator.d.mts +2 -3
  38. package/esm/drivers/mongodb/mongodb-id-generator.d.mts.map +1 -1
  39. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts +1 -3
  40. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -1
  41. package/esm/drivers/mongodb/mongodb-query-builder.d.mts +2 -3
  42. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
  43. package/esm/drivers/mongodb/mongodb-query-builder.mjs +8 -5
  44. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
  45. package/esm/drivers/mongodb/mongodb-query-operations.d.mts +1 -3
  46. package/esm/drivers/mongodb/mongodb-query-operations.d.mts.map +1 -1
  47. package/esm/drivers/mongodb/mongodb-query-parser.d.mts +7 -6
  48. package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
  49. package/esm/drivers/mongodb/mongodb-query-parser.mjs +2 -6
  50. package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
  51. package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts +1 -3
  52. package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts.map +1 -1
  53. package/esm/drivers/mongodb/types.d.mts +11 -9
  54. package/esm/drivers/mongodb/types.d.mts.map +1 -1
  55. package/esm/drivers/postgres/index.d.mts +2 -1
  56. package/esm/drivers/postgres/index.mjs +1 -1
  57. package/esm/drivers/postgres/naming.mjs +1 -1
  58. package/esm/drivers/postgres/postgres-blueprint.d.mts +1 -3
  59. package/esm/drivers/postgres/postgres-blueprint.d.mts.map +1 -1
  60. package/esm/drivers/postgres/postgres-dialect.d.mts +4 -6
  61. package/esm/drivers/postgres/postgres-dialect.d.mts.map +1 -1
  62. package/esm/drivers/postgres/postgres-driver.d.mts +4 -5
  63. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
  64. package/esm/drivers/postgres/postgres-migration-driver.d.mts +1 -3
  65. package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -1
  66. package/esm/drivers/postgres/postgres-migration-driver.mjs +13 -10
  67. package/esm/drivers/postgres/postgres-migration-driver.mjs.map +1 -1
  68. package/esm/drivers/postgres/postgres-query-builder.d.mts +4 -4
  69. package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -1
  70. package/esm/drivers/postgres/postgres-query-builder.mjs +14 -10
  71. package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -1
  72. package/esm/drivers/postgres/postgres-query-parser.d.mts +16 -11
  73. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
  74. package/esm/drivers/postgres/postgres-query-parser.mjs +1 -1
  75. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
  76. package/esm/drivers/postgres/postgres-sql-serializer.mjs +13 -10
  77. package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -1
  78. package/esm/drivers/postgres/postgres-ttl-purge.mjs +1 -1
  79. package/esm/drivers/postgres/postgres-type-converters.mjs +2 -2
  80. package/esm/drivers/postgres/postgres-type-converters.mjs.map +1 -1
  81. package/esm/drivers/postgres/postgres-update-validator.mjs +1 -1
  82. package/esm/drivers/postgres/postgres-update-validator.mjs.map +1 -1
  83. package/esm/drivers/postgres/types.d.mts +87 -45
  84. package/esm/drivers/postgres/types.d.mts.map +1 -1
  85. package/esm/drivers/sql/sql-dialect.contract.d.mts +1 -3
  86. package/esm/drivers/sql/sql-dialect.contract.d.mts.map +1 -1
  87. package/esm/drivers/sql/sql-types.d.mts +113 -59
  88. package/esm/drivers/sql/sql-types.d.mts.map +1 -1
  89. package/esm/errors/missing-data-source.error.d.mts +1 -2
  90. package/esm/errors/missing-data-source.error.d.mts.map +1 -1
  91. package/esm/errors/transaction-rollback.error.d.mts +1 -2
  92. package/esm/errors/transaction-rollback.error.d.mts.map +1 -1
  93. package/esm/errors/undefined-where-value.error.d.mts +1 -2
  94. package/esm/errors/undefined-where-value.error.d.mts.map +1 -1
  95. package/esm/errors/unsafe-filter.error.d.mts +1 -2
  96. package/esm/errors/unsafe-filter.error.d.mts.map +1 -1
  97. package/esm/errors/unsafe-raw-expression.error.d.mts +1 -2
  98. package/esm/errors/unsafe-raw-expression.error.d.mts.map +1 -1
  99. package/esm/errors/unsupported-lean-operation.error.d.mts +1 -2
  100. package/esm/errors/unsupported-lean-operation.error.d.mts.map +1 -1
  101. package/esm/errors/unsupported-lock-for-update.error.d.mts +1 -2
  102. package/esm/errors/unsupported-lock-for-update.error.d.mts.map +1 -1
  103. package/esm/errors/unsupported-query-operation.error.d.mts +1 -2
  104. package/esm/errors/unsupported-query-operation.error.d.mts.map +1 -1
  105. package/esm/errors/unsupported-update-operation.error.d.mts +1 -2
  106. package/esm/errors/unsupported-update-operation.error.d.mts.map +1 -1
  107. package/esm/events/model-events.d.mts +8 -6
  108. package/esm/events/model-events.d.mts.map +1 -1
  109. package/esm/expressions/aggregate-expressions.d.mts +7 -7
  110. package/esm/expressions/aggregate-expressions.d.mts.map +1 -1
  111. package/esm/expressions/column-expressions.d.mts +11 -11
  112. package/esm/expressions/column-expressions.d.mts.map +1 -1
  113. package/esm/index.d.mts +7 -2
  114. package/esm/index.mjs +1 -1
  115. package/esm/migration/column-builder.d.mts +2 -3
  116. package/esm/migration/column-builder.d.mts.map +1 -1
  117. package/esm/migration/column-helpers.d.mts +49 -50
  118. package/esm/migration/column-helpers.d.mts.map +1 -1
  119. package/esm/migration/column-helpers.mjs +1 -1
  120. package/esm/migration/foreign-key-builder.d.mts +2 -3
  121. package/esm/migration/foreign-key-builder.d.mts.map +1 -1
  122. package/esm/migration/index.d.mts +3 -2
  123. package/esm/migration/index.mjs +2 -2
  124. package/esm/migration/migration-runner.d.mts +7 -6
  125. package/esm/migration/migration-runner.d.mts.map +1 -1
  126. package/esm/migration/migration-runner.mjs +15 -11
  127. package/esm/migration/migration-runner.mjs.map +1 -1
  128. package/esm/migration/migration.d.mts +50 -32
  129. package/esm/migration/migration.d.mts.map +1 -1
  130. package/esm/migration/migration.mjs +1 -3
  131. package/esm/migration/migration.mjs.map +1 -1
  132. package/esm/migration/sql-serializer.d.mts +1 -3
  133. package/esm/migration/sql-serializer.d.mts.map +1 -1
  134. package/esm/migration/types.d.mts +7 -7
  135. package/esm/migration/types.d.mts.map +1 -1
  136. package/esm/model/methods/accessor-methods.mjs +1 -1
  137. package/esm/model/methods/accessor-methods.mjs.map +1 -1
  138. package/esm/model/methods/meta-methods.mjs +4 -2
  139. package/esm/model/methods/meta-methods.mjs.map +1 -1
  140. package/esm/model/methods/query-methods.mjs +1 -1
  141. package/esm/model/methods/write-methods.d.mts +3 -2
  142. package/esm/model/methods/write-methods.d.mts.map +1 -1
  143. package/esm/model/methods/write-methods.mjs +5 -2
  144. package/esm/model/methods/write-methods.mjs.map +1 -1
  145. package/esm/model/model.d.mts +9 -9
  146. package/esm/model/model.d.mts.map +1 -1
  147. package/esm/model/model.types.d.mts +7 -7
  148. package/esm/model/model.types.d.mts.map +1 -1
  149. package/esm/model/register-model.d.mts +13 -15
  150. package/esm/model/register-model.d.mts.map +1 -1
  151. package/esm/model/relation-decorators.d.mts +6 -8
  152. package/esm/model/relation-decorators.d.mts.map +1 -1
  153. package/esm/operations/database.d.mts +13 -8
  154. package/esm/operations/database.d.mts.map +1 -1
  155. package/esm/operations/index.d.mts +2 -1
  156. package/esm/operations/index.mjs +1 -1
  157. package/esm/operations/migrations.d.mts +18 -14
  158. package/esm/operations/migrations.d.mts.map +1 -1
  159. package/esm/query-builder/query-builder.d.mts +2 -4
  160. package/esm/query-builder/query-builder.d.mts.map +1 -1
  161. package/esm/query-builder/query-builder.mjs +12 -11
  162. package/esm/query-builder/query-builder.mjs.map +1 -1
  163. package/esm/relations/index.d.mts +2 -1
  164. package/esm/relations/index.mjs +1 -1
  165. package/esm/relations/key-conventions.mjs +2 -1
  166. package/esm/relations/key-conventions.mjs.map +1 -1
  167. package/esm/relations/pivot-operations.d.mts +3 -5
  168. package/esm/relations/pivot-operations.d.mts.map +1 -1
  169. package/esm/relations/relation-hydrator.d.mts +3 -5
  170. package/esm/relations/relation-hydrator.d.mts.map +1 -1
  171. package/esm/relations/relation-loader.d.mts +2 -4
  172. package/esm/relations/relation-loader.d.mts.map +1 -1
  173. package/esm/relations/relation-loader.mjs +4 -5
  174. package/esm/relations/relation-loader.mjs.map +1 -1
  175. package/esm/relations/types.d.mts +14 -15
  176. package/esm/relations/types.d.mts.map +1 -1
  177. package/esm/remover/database-remover.d.mts +1 -3
  178. package/esm/remover/database-remover.d.mts.map +1 -1
  179. package/esm/restorer/database-restorer.d.mts +1 -3
  180. package/esm/restorer/database-restorer.d.mts.map +1 -1
  181. package/esm/restorer/database-restorer.mjs +2 -1
  182. package/esm/restorer/database-restorer.mjs.map +1 -1
  183. package/esm/sql-database-dirty-tracker.d.mts +1 -3
  184. package/esm/sql-database-dirty-tracker.d.mts.map +1 -1
  185. package/esm/sync/model-events.mjs +1 -1
  186. package/esm/sync/model-sync-operation.d.mts +2 -4
  187. package/esm/sync/model-sync-operation.d.mts.map +1 -1
  188. package/esm/sync/model-sync.d.mts +3 -4
  189. package/esm/sync/model-sync.d.mts.map +1 -1
  190. package/esm/sync/sync-context.d.mts +2 -4
  191. package/esm/sync/sync-context.d.mts.map +1 -1
  192. package/esm/sync/sync-fanout.mjs +1 -1
  193. package/esm/sync/sync-manager.d.mts +2 -4
  194. package/esm/sync/sync-manager.d.mts.map +1 -1
  195. package/esm/sync/types.d.mts +121 -64
  196. package/esm/sync/types.d.mts.map +1 -1
  197. package/esm/transactions/after-commit.d.mts +2 -2
  198. package/esm/transactions/after-commit.d.mts.map +1 -1
  199. package/esm/types.d.mts +7 -8
  200. package/esm/types.d.mts.map +1 -1
  201. package/esm/utils/connect-to-database.d.mts +7 -8
  202. package/esm/utils/connect-to-database.d.mts.map +1 -1
  203. package/esm/utils/database-writer.utils.d.mts +3 -4
  204. package/esm/utils/database-writer.utils.d.mts.map +1 -1
  205. package/esm/utils/define-model.d.mts +3 -5
  206. package/esm/utils/define-model.d.mts.map +1 -1
  207. package/esm/utils/escape-regex.d.mts +3 -4
  208. package/esm/utils/escape-regex.d.mts.map +1 -1
  209. package/esm/utils/once-connected.d.mts +2 -4
  210. package/esm/utils/once-connected.d.mts.map +1 -1
  211. package/esm/utils/sanitize-filter.d.mts +3 -4
  212. package/esm/utils/sanitize-filter.d.mts.map +1 -1
  213. package/esm/validation/database-seal-plugins.d.mts +2 -1
  214. package/esm/validation/database-writer-validation-error.d.mts +1 -3
  215. package/esm/validation/database-writer-validation-error.d.mts.map +1 -1
  216. package/esm/validation/index.d.mts +3 -1
  217. package/esm/validation/index.mjs +1 -1
  218. package/esm/validation/plugins/database-rules-plugin.d.mts +2 -3
  219. package/esm/validation/plugins/database-rules-plugin.d.mts.map +1 -1
  220. package/esm/validation/plugins/embed-validator-plugin.d.mts +4 -3
  221. package/esm/validation/plugins/embed-validator-plugin.d.mts.map +1 -1
  222. package/esm/validation/types.d.mts +14 -10
  223. package/esm/validation/types.d.mts.map +1 -1
  224. package/esm/validation/validators/embed-validator.d.mts +2 -3
  225. package/esm/validation/validators/embed-validator.d.mts.map +1 -1
  226. package/esm/writer/database-writer.d.mts +1 -3
  227. package/esm/writer/database-writer.d.mts.map +1 -1
  228. package/esm/writer/database-writer.mjs +1 -1
  229. package/esm/writer/database-writer.mjs.map +1 -1
  230. package/package.json +5 -5
@@ -1,10 +1,9 @@
1
1
  import { PendingOperation } from "./migration.mjs";
2
-
3
2
  //#region ../../packages/cascade/src/migration/sql-serializer.d.ts
4
3
  /**
5
4
  * Converts PendingOperation objects to SQL strings for a specific dialect.
6
5
  */
7
- declare abstract class SQLSerializer {
6
+ export declare abstract class SQLSerializer {
8
7
  /**
9
8
  * Serialize a single pending operation into one or more SQL strings.
10
9
  *
@@ -22,5 +21,4 @@ declare abstract class SQLSerializer {
22
21
  serializeAll(operations: PendingOperation[], table: string): string[];
23
22
  }
24
23
  //#endregion
25
- export { SQLSerializer };
26
24
  //# sourceMappingURL=sql-serializer.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sql-serializer.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/migration/sql-serializer.ts"],"mappings":";;;;;AAKA;uBAAsB,aAAA;;;;;;;;WAQX,SAAA,CAAU,SAAA,EAAW,gBAAA,EAAkB,KAAA;EAQnC;;;AAA6C;;;EAA1D,YAAA,CAAa,UAAA,EAAY,gBAAgB,IAAI,KAAA;AAAA"}
1
+ {"version":3,"file":"sql-serializer.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/migration/sql-serializer.ts"],"mappings":";;;;;8BAKsB;;;;;;;;WAQX,UAAU,WAAW,kBAAkB;;;;;;;EAQhD,aAAa,YAAY,oBAAoB"}
@@ -1,8 +1,9 @@
1
+ import "./migration.mjs";
1
2
  //#region ../../packages/cascade/src/migration/types.d.ts
2
3
  /**
3
4
  * Result of a single migration execution.
4
5
  */
5
- interface MigrationResult {
6
+ export interface MigrationResult {
6
7
  /** Migration name/identifier */
7
8
  readonly name: string;
8
9
  /** Table/collection affected */
@@ -21,7 +22,7 @@ interface MigrationResult {
21
22
  /**
22
23
  * Status of a migration file.
23
24
  */
24
- interface MigrationStatus {
25
+ export interface MigrationStatus {
25
26
  /** Migration name/identifier */
26
27
  readonly name: string;
27
28
  /** Table/collection affected */
@@ -38,7 +39,7 @@ interface MigrationStatus {
38
39
  /**
39
40
  * Record stored in the migrations table.
40
41
  */
41
- interface MigrationRecord {
42
+ export interface MigrationRecord {
42
43
  /** Migration name/identifier */
43
44
  name: string;
44
45
  /** Batch number */
@@ -51,7 +52,7 @@ interface MigrationRecord {
51
52
  /**
52
53
  * Options for the migration runner.
53
54
  */
54
- interface MigrationRunnerOptions {
55
+ export interface MigrationRunnerOptions {
55
56
  /**
56
57
  * Glob pattern for finding migration files.
57
58
  *
@@ -84,7 +85,7 @@ interface MigrationRunnerOptions {
84
85
  /**
85
86
  * Options for running migrations.
86
87
  */
87
- interface RunMigrationsOptions {
88
+ export interface RunMigrationsOptions {
88
89
  /**
89
90
  * Specific migrations to run (by name).
90
91
  * If not provided, runs all pending migrations.
@@ -98,7 +99,7 @@ interface RunMigrationsOptions {
98
99
  /**
99
100
  * Options for rolling back migrations.
100
101
  */
101
- interface RollbackOptions {
102
+ export interface RollbackOptions {
102
103
  /**
103
104
  * Number of batches to rollback.
104
105
  *
@@ -115,5 +116,4 @@ interface RollbackOptions {
115
116
  readonly dryRun?: boolean;
116
117
  }
117
118
  //#endregion
118
- export { MigrationRecord, MigrationResult, MigrationRunnerOptions, MigrationStatus, RollbackOptions, RunMigrationsOptions };
119
119
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/migration/types.ts"],"mappings":";;;AAKA;UAAiB,eAAA;;WAEN,IAAA;EAAA;EAAA,SAEA,KAAA;EAEA;EAAA,SAAA,SAAA;EAIA;EAAA,SAFA,OAAA;EAMA;EAAA,SAJA,KAAA;EAIgB;EAAA,SAFhB,UAAA;EAQM;EAAA,SANN,UAAA,EAAY,IAAI;AAAA;;;;UAMV,eAAA;EAQN;EAAA,SANA,IAAA;EAQY;EAAA,SANZ,KAAA;EAQQ;EAAA,SANR,QAAA;EA4BM;EAAA,SA1BN,KAAA;;WAEA,UAAA,EAAY,IAAI;EA0BzB;EAAA,SAxBS,QAAA;AAAA;AAoEO;AAMlB;;AANkB,UA9CD,eAAA;EAyDN;EAvDT,IAAA;EAkEe;EAhEf,KAAA;;EAEA,UAAA,EAAY,IAAA;EAoEH;EAlET,SAAA,EAAW,IAAI;AAAA;;AA4EA;;UAtEA,sBAAA;;;;;;WAMN,OAAA;;;;WAKA,SAAA;;;;;;WAOA,eAAA;;;;;;WAOA,MAAA;;;;;;WAOA,OAAA;AAAA;;;;UAMM,oBAAA;;;;;WAKN,IAAA;;;;WAKA,MAAM;AAAA;;;;UAMA,eAAA;;;;;;WAMN,OAAA;;;;WAKA,IAAA;;;;WAKA,MAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/migration/types.ts"],"mappings":";;;;;iBAKiB;;WAEN;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,YAAY;;;;;iBAMN;;WAEN;;WAEA;;WAEA;;WAEA;;WAEA,YAAY;;WAEZ;;;;;iBAsBM;;EAEf;;EAEA;;EAEA,YAAY;;EAEZ,WAAW;;;;;iBAMI;;;;;;WAMN;;;;WAKA;;;;;;WAOA;;;;;;WAOA;;;;;;WAOA;;;;;iBAMM;;;;;WAKN;;;;WAKA;;;;;iBAMM;;;;;;WAMN;;;;WAKA;;;;WAKA"}
@@ -55,7 +55,7 @@ function unsetFields(model, ...fields) {
55
55
  */
56
56
  function stripIdentityColumns(model, values) {
57
57
  if (model.isNew) return values;
58
- const identityColumns = new Set([
58
+ const identityColumns = /* @__PURE__ */ new Set([
59
59
  model.getPrimaryKey(),
60
60
  "id",
61
61
  "_id"
@@ -1 +1 @@
1
- {"version":3,"file":"accessor-methods.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/accessor-methods.ts"],"sourcesContent":["import { get, merge, only, set, unset } from \"@mongez/reinforcements\";\nimport { pruneEmptyParents } from \"../../utils/prune-empty-parents\";\nimport type { Model } from \"../model\";\n\n/**\n * Sentinel symbol to distinguish a genuinely missing field from a field\n * whose value is `undefined`. Encapsulated here — callers use `hasField()`.\n */\nconst MISSING_VALUE = Symbol(\"missing\");\n\nexport function getFieldValue(model: Model, field: string, defaultValue?: unknown): any {\n return get(model.data, field, defaultValue);\n}\n\nexport function setFieldValue(model: Model, field: string, value: unknown): Model {\n const path = String(field);\n set(model.data, path, value);\n\n model.dirtyTracker.setAtPath(path, value);\n\n return model;\n}\n\nexport function hasField(model: Model, field: string): boolean {\n return get(model.data, field, MISSING_VALUE as any) !== MISSING_VALUE;\n}\n\nexport function incrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const incrementedValue = value + (amount ?? 1);\n return setFieldValue(model, field, incrementedValue);\n}\n\nexport function decrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const decrementedValue = value - (amount ?? 1);\n return setFieldValue(model, field, decrementedValue);\n}\n\n/**\n * Remove fields from the model data.\n *\n * Unsetting the last key of a nested object also removes the parents that this\n * unset left empty (`unset(\"a.b\")` on `{ a: { b: 1 } }` leaves `{}`, not\n * `{ a: {} }`). A parent is pruned only when this unset emptied it: an object\n * the user stored as `{}` is never touched, and arrays are never pruned.\n */\nexport function unsetFields(model: Model, ...fields: string[]): Model {\n const existing = fields.filter((field) => hasField(model, field));\n\n model.data = unset(model.data, fields);\n\n for (const field of existing) {\n pruneEmptyParents(model.data, field);\n }\n\n model.dirtyTracker.unset(fields);\n\n return model;\n}\n\n/**\n * Identity columns that a mass-assignment payload may never carry into an\n * already-persisted model. `merge()` is the method request bodies reach\n * (`model.merge(req.body)` / `save({ merge })`), and the primary key is what\n * the UPDATE filter is built from — letting it through means a payload of\n * `{ id: \"<victim-id>\" }` rewrites which document the save targets. Both the\n * configured primary key and the two framework identity columns are dropped,\n * because `id` and `_id` are managed by the writer/driver either way.\n *\n * A NEW model is untouched: creating with an explicit id is a legitimate flow,\n * and the writer itself merges the driver-returned document (`_id`, defaults)\n * back onto the instance before it is marked persisted.\n */\nfunction stripIdentityColumns(\n model: Model,\n values: Record<string, unknown>,\n): Record<string, unknown> {\n if (model.isNew) return values;\n\n const identityColumns = new Set([model.getPrimaryKey(), \"id\", \"_id\"]);\n const blockedKeys = Object.keys(values).filter((key) => identityColumns.has(key));\n\n if (blockedKeys.length === 0) return values;\n\n // Copy — the caller's object (often the request body itself) is not ours to mutate.\n const safeValues = { ...values };\n for (const key of blockedKeys) {\n delete safeValues[key];\n }\n\n return safeValues;\n}\n\nexport function mergeFields(model: Model, values: Record<string, unknown>): Model {\n return mergeDriverFields(model, stripIdentityColumns(model, values));\n}\n\n/**\n * Merge a document the DRIVER produced (generated `_id`, `RETURNING *`, DB\n * defaults) back onto the model, identity columns included.\n *\n * Framework-internal counterpart of {@link mergeFields}: the write pipeline is\n * the one caller allowed to set identity columns on an already-persisted\n * instance, because the values come from the database rather than from a\n * request. Never route caller-supplied data through this.\n */\nexport function mergeDriverFields(model: Model, values: Record<string, unknown>): Model {\n model.data = merge(model.data, values) as any;\n model.dirtyTracker.mergeChanges(values);\n return model;\n}\n\nexport function getOnlyFields(model: Model, fields: string[]): Record<string, unknown> {\n return only(model.data, fields);\n}\n\nexport function getStringField(\n model: Model,\n key: string,\n defaultValue?: string,\n): string | undefined {\n return getFieldValue(model, key, defaultValue) as string | undefined;\n}\n\nexport function getNumberField(\n model: Model,\n key: string,\n defaultValue?: number,\n): number | undefined {\n return getFieldValue(model, key, defaultValue) as number | undefined;\n}\n\nexport function getBooleanField(\n model: Model,\n key: string,\n defaultValue?: boolean,\n): boolean | undefined {\n return getFieldValue(model, key, defaultValue) as boolean | undefined;\n}\n"],"mappings":";;;;;;;;AAQA,MAAM,gBAAgB,OAAO,SAAS;AAEtC,SAAgB,cAAc,OAAc,OAAe,cAA6B;CACtF,OAAO,IAAI,MAAM,MAAM,OAAO,YAAY;AAC5C;AAEA,SAAgB,cAAc,OAAc,OAAe,OAAuB;CAChF,MAAM,OAAO,OAAO,KAAK;CACzB,IAAI,MAAM,MAAM,MAAM,KAAK;CAE3B,MAAM,aAAa,UAAU,MAAM,KAAK;CAExC,OAAO;AACT;AAEA,SAAgB,SAAS,OAAc,OAAwB;CAC7D,OAAO,IAAI,MAAM,MAAM,OAAO,aAAoB,MAAM;AAC1D;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;;;;;;;;;AAUA,SAAgB,YAAY,OAAc,GAAG,QAAyB;CACpE,MAAM,WAAW,OAAO,QAAQ,UAAU,SAAS,OAAO,KAAK,CAAC;CAEhE,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CAErC,KAAK,MAAM,SAAS,UAClB,kBAAkB,MAAM,MAAM,KAAK;CAGrC,MAAM,aAAa,MAAM,MAAM;CAE/B,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAS,qBACP,OACA,QACyB;CACzB,IAAI,MAAM,OAAO,OAAO;CAExB,MAAM,kBAAkB,IAAI,IAAI;EAAC,MAAM,cAAc;EAAG;EAAM;CAAK,CAAC;CACpE,MAAM,cAAc,OAAO,KAAK,MAAM,CAAC,CAAC,QAAQ,QAAQ,gBAAgB,IAAI,GAAG,CAAC;CAEhF,IAAI,YAAY,WAAW,GAAG,OAAO;CAGrC,MAAM,aAAa,EAAE,GAAG,OAAO;CAC/B,KAAK,MAAM,OAAO,aAChB,OAAO,WAAW;CAGpB,OAAO;AACT;AAEA,SAAgB,YAAY,OAAc,QAAwC;CAChF,OAAO,kBAAkB,OAAO,qBAAqB,OAAO,MAAM,CAAC;AACrE;;;;;;;;;;AAWA,SAAgB,kBAAkB,OAAc,QAAwC;CACtF,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CACrC,MAAM,aAAa,aAAa,MAAM;CACtC,OAAO;AACT;AAEA,SAAgB,cAAc,OAAc,QAA2C;CACrF,OAAO,KAAK,MAAM,MAAM,MAAM;AAChC;AAEA,SAAgB,eACd,OACA,KACA,cACoB;CACpB,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,eACd,OACA,KACA,cACoB;CACpB,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,gBACd,OACA,KACA,cACqB;CACrB,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C"}
1
+ {"version":3,"file":"accessor-methods.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/accessor-methods.ts"],"sourcesContent":["import { get, merge, only, set, unset } from \"@mongez/reinforcements\";\nimport { pruneEmptyParents } from \"../../utils/prune-empty-parents\";\nimport type { Model } from \"../model\";\n\n/**\n * Sentinel symbol to distinguish a genuinely missing field from a field\n * whose value is `undefined`. Encapsulated here — callers use `hasField()`.\n */\nconst MISSING_VALUE = Symbol(\"missing\");\n\nexport function getFieldValue(model: Model, field: string, defaultValue?: unknown): any {\n return get(model.data, field, defaultValue);\n}\n\nexport function setFieldValue(model: Model, field: string, value: unknown): Model {\n const path = String(field);\n set(model.data, path, value);\n\n model.dirtyTracker.setAtPath(path, value);\n\n return model;\n}\n\nexport function hasField(model: Model, field: string): boolean {\n return get(model.data, field, MISSING_VALUE as any) !== MISSING_VALUE;\n}\n\nexport function incrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const incrementedValue = value + (amount ?? 1);\n return setFieldValue(model, field, incrementedValue);\n}\n\nexport function decrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const decrementedValue = value - (amount ?? 1);\n return setFieldValue(model, field, decrementedValue);\n}\n\n/**\n * Remove fields from the model data.\n *\n * Unsetting the last key of a nested object also removes the parents that this\n * unset left empty (`unset(\"a.b\")` on `{ a: { b: 1 } }` leaves `{}`, not\n * `{ a: {} }`). A parent is pruned only when this unset emptied it: an object\n * the user stored as `{}` is never touched, and arrays are never pruned.\n */\nexport function unsetFields(model: Model, ...fields: string[]): Model {\n const existing = fields.filter((field) => hasField(model, field));\n\n model.data = unset(model.data, fields);\n\n for (const field of existing) {\n pruneEmptyParents(model.data, field);\n }\n\n model.dirtyTracker.unset(fields);\n\n return model;\n}\n\n/**\n * Identity columns that a mass-assignment payload may never carry into an\n * already-persisted model. `merge()` is the method request bodies reach\n * (`model.merge(req.body)` / `save({ merge })`), and the primary key is what\n * the UPDATE filter is built from — letting it through means a payload of\n * `{ id: \"<victim-id>\" }` rewrites which document the save targets. Both the\n * configured primary key and the two framework identity columns are dropped,\n * because `id` and `_id` are managed by the writer/driver either way.\n *\n * A NEW model is untouched: creating with an explicit id is a legitimate flow,\n * and the writer itself merges the driver-returned document (`_id`, defaults)\n * back onto the instance before it is marked persisted.\n */\nfunction stripIdentityColumns(\n model: Model,\n values: Record<string, unknown>,\n): Record<string, unknown> {\n if (model.isNew) return values;\n\n const identityColumns = new Set([model.getPrimaryKey(), \"id\", \"_id\"]);\n const blockedKeys = Object.keys(values).filter((key) => identityColumns.has(key));\n\n if (blockedKeys.length === 0) return values;\n\n // Copy — the caller's object (often the request body itself) is not ours to mutate.\n const safeValues = { ...values };\n for (const key of blockedKeys) {\n delete safeValues[key];\n }\n\n return safeValues;\n}\n\nexport function mergeFields(model: Model, values: Record<string, unknown>): Model {\n return mergeDriverFields(model, stripIdentityColumns(model, values));\n}\n\n/**\n * Merge a document the DRIVER produced (generated `_id`, `RETURNING *`, DB\n * defaults) back onto the model, identity columns included.\n *\n * Framework-internal counterpart of {@link mergeFields}: the write pipeline is\n * the one caller allowed to set identity columns on an already-persisted\n * instance, because the values come from the database rather than from a\n * request. Never route caller-supplied data through this.\n */\nexport function mergeDriverFields(model: Model, values: Record<string, unknown>): Model {\n model.data = merge(model.data, values) as any;\n model.dirtyTracker.mergeChanges(values);\n return model;\n}\n\nexport function getOnlyFields(model: Model, fields: string[]): Record<string, unknown> {\n return only(model.data, fields);\n}\n\nexport function getStringField(\n model: Model,\n key: string,\n defaultValue?: string,\n): string | undefined {\n return getFieldValue(model, key, defaultValue) as string | undefined;\n}\n\nexport function getNumberField(\n model: Model,\n key: string,\n defaultValue?: number,\n): number | undefined {\n return getFieldValue(model, key, defaultValue) as number | undefined;\n}\n\nexport function getBooleanField(\n model: Model,\n key: string,\n defaultValue?: boolean,\n): boolean | undefined {\n return getFieldValue(model, key, defaultValue) as boolean | undefined;\n}\n"],"mappings":";;;;;;;;AAQA,MAAM,gBAAgB,OAAO,SAAS;AAEtC,SAAgB,cAAc,OAAc,OAAe,cAA6B;CACtF,OAAO,IAAI,MAAM,MAAM,OAAO,YAAY;AAC5C;AAEA,SAAgB,cAAc,OAAc,OAAe,OAAuB;CAChF,MAAM,OAAO,OAAO,KAAK;CACzB,IAAI,MAAM,MAAM,MAAM,KAAK;CAE3B,MAAM,aAAa,UAAU,MAAM,KAAK;CAExC,OAAO;AACT;AAEA,SAAgB,SAAS,OAAc,OAAwB;CAC7D,OAAO,IAAI,MAAM,MAAM,OAAO,aAAoB,MAAM;AAC1D;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;;;;;;;;;AAUA,SAAgB,YAAY,OAAc,GAAG,QAAyB;CACpE,MAAM,WAAW,OAAO,QAAQ,UAAU,SAAS,OAAO,KAAK,CAAC;CAEhE,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CAErC,KAAK,MAAM,SAAS,UAClB,kBAAkB,MAAM,MAAM,KAAK;CAGrC,MAAM,aAAa,MAAM,MAAM;CAE/B,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAS,qBACP,OACA,QACyB;CACzB,IAAI,MAAM,OAAO,OAAO;CAExB,MAAM,kCAAkB,IAAI,IAAI;EAAC,MAAM,cAAc;EAAG;EAAM;CAAK,CAAC;CACpE,MAAM,cAAc,OAAO,KAAK,MAAM,CAAC,CAAC,QAAQ,QAAQ,gBAAgB,IAAI,GAAG,CAAC;CAEhF,IAAI,YAAY,WAAW,GAAG,OAAO;CAGrC,MAAM,aAAa,EAAE,GAAG,OAAO;CAC/B,KAAK,MAAM,OAAO,aAChB,OAAO,WAAW;CAGpB,OAAO;AACT;AAEA,SAAgB,YAAY,OAAc,QAAwC;CAChF,OAAO,kBAAkB,OAAO,qBAAqB,OAAO,MAAM,CAAC;AACrE;;;;;;;;;;AAWA,SAAgB,kBAAkB,OAAc,QAAwC;CACtF,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CACrC,MAAM,aAAa,aAAa,MAAM;CACtC,OAAO;AACT;AAEA,SAAgB,cAAc,OAAc,QAA2C;CACrF,OAAO,KAAK,MAAM,MAAM,MAAM;AAChC;AAEA,SAAgB,eACd,OACA,KACA,cACoB;CACpB,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,eACd,OACA,KACA,cACoB;CACpB,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,gBACd,OACA,KACA,cACqB;CACrB,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C"}
@@ -26,8 +26,10 @@ function applyDefaultsToModel(ModelClass, defaults) {
26
26
  if (defaults.updatedAtColumn !== void 0 && !isExplicitStatic(ModelClass, "updatedAtColumn")) ModelClass.updatedAtColumn = defaults.updatedAtColumn;
27
27
  if (defaults.deleteStrategy !== void 0 && !isExplicitStatic(ModelClass, "deleteStrategy")) ModelClass.deleteStrategy = defaults.deleteStrategy;
28
28
  if (defaults.deletedAtColumn !== void 0 && !isExplicitStatic(ModelClass, "deletedAtColumn")) ModelClass.deletedAtColumn = defaults.deletedAtColumn;
29
- if (defaults.trashTable !== void 0 && !isExplicitStatic(ModelClass, "trashTable")) if (typeof defaults.trashTable === "function") ModelClass.trashTable = defaults.trashTable(ModelClass.table);
30
- else ModelClass.trashTable = defaults.trashTable;
29
+ if (defaults.trashTable !== void 0 && !isExplicitStatic(ModelClass, "trashTable")) {
30
+ if (typeof defaults.trashTable === "function") ModelClass.trashTable = defaults.trashTable(ModelClass.table);
31
+ else ModelClass.trashTable = defaults.trashTable;
32
+ }
31
33
  if (defaults.strictMode !== void 0 && !isExplicitStatic(ModelClass, "strictMode")) ModelClass.strictMode = defaults.strictMode;
32
34
  }
33
35
  async function generateModelNextId(model) {
@@ -1 +1 @@
1
- {"version":3,"file":"meta-methods.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/meta-methods.ts"],"sourcesContent":["import { get, set } from \"@mongez/reinforcements\";\nimport { DatabaseWriter } from \"../../writer/database-writer\";\nimport type { Model } from \"../model\";\n\n/**\n * Whether a subclass (or an intermediate base below `Model`) set the static\n * itself. The base `Model` initialises several statics (strictMode,\n * autoGenerateId, incrementIdBy, deletedAtColumn), so comparing to\n * `undefined` would never let data-source defaults apply.\n */\nfunction isExplicitStatic(ModelClass: any, key: string): boolean {\n let current = ModelClass;\n\n // The base Model is the class whose parent is `Function.prototype`; its own\n // initialisers are framework fallbacks, not explicit choices.\n while (current && Object.getPrototypeOf(current) !== Function.prototype) {\n if (Object.prototype.hasOwnProperty.call(current, key) && current[key] !== undefined) {\n return true;\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return false;\n}\n\nexport function applyDefaultsToModel(ModelClass: any, defaults: any): void {\n // Only apply defaults if model doesn't have its own value\n\n // ============================================================================\n // ID Generation\n // ============================================================================\n if (defaults.autoGenerateId !== undefined && !isExplicitStatic(ModelClass, \"autoGenerateId\")) {\n ModelClass.autoGenerateId = defaults.autoGenerateId;\n }\n if (defaults.initialId !== undefined && !isExplicitStatic(ModelClass, \"initialId\")) {\n ModelClass.initialId = defaults.initialId;\n }\n if (defaults.randomInitialId !== undefined && !isExplicitStatic(ModelClass, \"randomInitialId\")) {\n ModelClass.randomInitialId = defaults.randomInitialId;\n }\n if (defaults.incrementIdBy !== undefined && !isExplicitStatic(ModelClass, \"incrementIdBy\")) {\n ModelClass.incrementIdBy = defaults.incrementIdBy;\n }\n if (defaults.randomIncrement !== undefined && !isExplicitStatic(ModelClass, \"randomIncrement\")) {\n ModelClass.randomIncrement = defaults.randomIncrement;\n }\n\n // ============================================================================\n // Timestamps\n // ============================================================================\n if (defaults.createdAtColumn !== undefined && !isExplicitStatic(ModelClass, \"createdAtColumn\")) {\n ModelClass.createdAtColumn = defaults.createdAtColumn;\n }\n\n if (defaults.updatedAtColumn !== undefined && !isExplicitStatic(ModelClass, \"updatedAtColumn\")) {\n ModelClass.updatedAtColumn = defaults.updatedAtColumn;\n }\n\n // ============================================================================\n // Deletion\n // ============================================================================\n if (defaults.deleteStrategy !== undefined && !isExplicitStatic(ModelClass, \"deleteStrategy\")) {\n ModelClass.deleteStrategy = defaults.deleteStrategy;\n }\n if (defaults.deletedAtColumn !== undefined && !isExplicitStatic(ModelClass, \"deletedAtColumn\")) {\n ModelClass.deletedAtColumn = defaults.deletedAtColumn;\n }\n if (defaults.trashTable !== undefined && !isExplicitStatic(ModelClass, \"trashTable\")) {\n // Handle function-based trash table\n if (typeof defaults.trashTable === \"function\") {\n ModelClass.trashTable = defaults.trashTable(ModelClass.table);\n } else {\n ModelClass.trashTable = defaults.trashTable;\n }\n }\n\n // ============================================================================\n // Validation\n // ============================================================================\n if (defaults.strictMode !== undefined && !isExplicitStatic(ModelClass, \"strictMode\")) {\n ModelClass.strictMode = defaults.strictMode;\n }\n}\n\nexport async function generateModelNextId(model: Model): Promise<number | string> {\n const writer = new DatabaseWriter(model);\n await writer.generateNextId();\n return model.id!;\n}\n\nexport async function performAtomicUpdate(\n model: Model,\n operations: Record<string, unknown>,\n): Promise<number> {\n return model.self().atomic({ [model.self().primaryKey]: model.trustedPrimaryKey }, operations);\n}\n\n/**\n * Apply an atomic delta to the local value without marking the field dirty.\n * The database already holds the change, so a later `save()` must not send a\n * stale `$set` for it. Other pending changes stay dirty.\n */\nfunction applyLocalDelta(model: Model, field: string, delta: number): void {\n const tracker = model.dirtyTracker;\n const fieldWasDirty = tracker.isDirty(field);\n const value = (get(model.data, field, 0) as number) + delta;\n\n set(model.data, field, value);\n\n // A removed column can't be replayed after a baseline reset, so fall back to\n // plain dirty tracking for that rare case.\n if (fieldWasDirty || tracker.getRemovedColumns().length > 0) {\n tracker.setAtPath(field, value);\n return;\n }\n\n const pending = tracker.getDirtyColumnsWithValues();\n const baseline = structuredClone(model.data) as Record<string, unknown>;\n\n for (const [column, values] of Object.entries(pending)) {\n set(baseline, column, values.oldValue);\n }\n\n tracker.reset(baseline);\n\n for (const [column, values] of Object.entries(pending)) {\n tracker.setAtPath(column, values.newValue);\n }\n}\n\nexport async function performAtomicIncrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n const result = await performAtomicUpdate(model, { $inc: { [field]: amount } });\n applyLocalDelta(model, field, amount);\n return result;\n}\n\nexport async function performAtomicDecrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n const result = await performAtomicUpdate(model, { $inc: { [field]: -amount } });\n applyLocalDelta(model, field, -amount);\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"meta-methods.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/meta-methods.ts"],"sourcesContent":["import { get, set } from \"@mongez/reinforcements\";\nimport { DatabaseWriter } from \"../../writer/database-writer\";\nimport type { Model } from \"../model\";\n\n/**\n * Whether a subclass (or an intermediate base below `Model`) set the static\n * itself. The base `Model` initialises several statics (strictMode,\n * autoGenerateId, incrementIdBy, deletedAtColumn), so comparing to\n * `undefined` would never let data-source defaults apply.\n */\nfunction isExplicitStatic(ModelClass: any, key: string): boolean {\n let current = ModelClass;\n\n // The base Model is the class whose parent is `Function.prototype`; its own\n // initialisers are framework fallbacks, not explicit choices.\n while (current && Object.getPrototypeOf(current) !== Function.prototype) {\n if (Object.prototype.hasOwnProperty.call(current, key) && current[key] !== undefined) {\n return true;\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return false;\n}\n\nexport function applyDefaultsToModel(ModelClass: any, defaults: any): void {\n // Only apply defaults if model doesn't have its own value\n\n // ============================================================================\n // ID Generation\n // ============================================================================\n if (defaults.autoGenerateId !== undefined && !isExplicitStatic(ModelClass, \"autoGenerateId\")) {\n ModelClass.autoGenerateId = defaults.autoGenerateId;\n }\n if (defaults.initialId !== undefined && !isExplicitStatic(ModelClass, \"initialId\")) {\n ModelClass.initialId = defaults.initialId;\n }\n if (defaults.randomInitialId !== undefined && !isExplicitStatic(ModelClass, \"randomInitialId\")) {\n ModelClass.randomInitialId = defaults.randomInitialId;\n }\n if (defaults.incrementIdBy !== undefined && !isExplicitStatic(ModelClass, \"incrementIdBy\")) {\n ModelClass.incrementIdBy = defaults.incrementIdBy;\n }\n if (defaults.randomIncrement !== undefined && !isExplicitStatic(ModelClass, \"randomIncrement\")) {\n ModelClass.randomIncrement = defaults.randomIncrement;\n }\n\n // ============================================================================\n // Timestamps\n // ============================================================================\n if (defaults.createdAtColumn !== undefined && !isExplicitStatic(ModelClass, \"createdAtColumn\")) {\n ModelClass.createdAtColumn = defaults.createdAtColumn;\n }\n\n if (defaults.updatedAtColumn !== undefined && !isExplicitStatic(ModelClass, \"updatedAtColumn\")) {\n ModelClass.updatedAtColumn = defaults.updatedAtColumn;\n }\n\n // ============================================================================\n // Deletion\n // ============================================================================\n if (defaults.deleteStrategy !== undefined && !isExplicitStatic(ModelClass, \"deleteStrategy\")) {\n ModelClass.deleteStrategy = defaults.deleteStrategy;\n }\n if (defaults.deletedAtColumn !== undefined && !isExplicitStatic(ModelClass, \"deletedAtColumn\")) {\n ModelClass.deletedAtColumn = defaults.deletedAtColumn;\n }\n if (defaults.trashTable !== undefined && !isExplicitStatic(ModelClass, \"trashTable\")) {\n // Handle function-based trash table\n if (typeof defaults.trashTable === \"function\") {\n ModelClass.trashTable = defaults.trashTable(ModelClass.table);\n } else {\n ModelClass.trashTable = defaults.trashTable;\n }\n }\n\n // ============================================================================\n // Validation\n // ============================================================================\n if (defaults.strictMode !== undefined && !isExplicitStatic(ModelClass, \"strictMode\")) {\n ModelClass.strictMode = defaults.strictMode;\n }\n}\n\nexport async function generateModelNextId(model: Model): Promise<number | string> {\n const writer = new DatabaseWriter(model);\n await writer.generateNextId();\n return model.id!;\n}\n\nexport async function performAtomicUpdate(\n model: Model,\n operations: Record<string, unknown>,\n): Promise<number> {\n return model.self().atomic({ [model.self().primaryKey]: model.trustedPrimaryKey }, operations);\n}\n\n/**\n * Apply an atomic delta to the local value without marking the field dirty.\n * The database already holds the change, so a later `save()` must not send a\n * stale `$set` for it. Other pending changes stay dirty.\n */\nfunction applyLocalDelta(model: Model, field: string, delta: number): void {\n const tracker = model.dirtyTracker;\n const fieldWasDirty = tracker.isDirty(field);\n const value = (get(model.data, field, 0) as number) + delta;\n\n set(model.data, field, value);\n\n // A removed column can't be replayed after a baseline reset, so fall back to\n // plain dirty tracking for that rare case.\n if (fieldWasDirty || tracker.getRemovedColumns().length > 0) {\n tracker.setAtPath(field, value);\n return;\n }\n\n const pending = tracker.getDirtyColumnsWithValues();\n const baseline = structuredClone(model.data) as Record<string, unknown>;\n\n for (const [column, values] of Object.entries(pending)) {\n set(baseline, column, values.oldValue);\n }\n\n tracker.reset(baseline);\n\n for (const [column, values] of Object.entries(pending)) {\n tracker.setAtPath(column, values.newValue);\n }\n}\n\nexport async function performAtomicIncrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n const result = await performAtomicUpdate(model, { $inc: { [field]: amount } });\n applyLocalDelta(model, field, amount);\n return result;\n}\n\nexport async function performAtomicDecrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n const result = await performAtomicUpdate(model, { $inc: { [field]: -amount } });\n applyLocalDelta(model, field, -amount);\n return result;\n}\n"],"mappings":"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"}
@@ -234,5 +234,5 @@ function resolveDataSource(ModelClass) {
234
234
  }
235
235
 
236
236
  //#endregion
237
- export { buildNewQueryBuilder, buildQuery, countRecords, decreaseField, findAll, findAndReplaceRecord, findAndUpdateRecords, findById, findFirst, findLast, findLatest, findOneAndDeleteRecord, findOneAndUpdateRecord, increaseField, paginateRecords, performAtomic, resolveDataSource, updateById };
237
+ export { buildNewQueryBuilder, buildQuery, countRecords, decreaseField, findAll, findAndReplaceRecord, findAndUpdateRecords, findById, findFirst, findLast, findLatest, findOneAndDeleteRecord, findOneAndUpdateRecord, increaseField, paginateRecords, performAtomic, resolveDataSource, scopeUpsertFilter, scopeWriteFilter, updateById };
238
238
  //# sourceMappingURL=query-methods.mjs.map
@@ -1,8 +1,10 @@
1
+ import "../model.mjs";
2
+ import "../../contracts/index.mjs";
1
3
  //#region ../../packages/cascade/src/model/methods/write-methods.d.ts
2
4
  /**
3
5
  * Options for {@link createManyRecords} (and `Model.createMany`).
4
6
  */
5
- type CreateManyOptions = {
7
+ export type CreateManyOptions = {
6
8
  /**
7
9
  * Number of rows processed per chunk.
8
10
  *
@@ -25,5 +27,4 @@ type CreateManyOptions = {
25
27
  bulk?: boolean;
26
28
  };
27
29
  //#endregion
28
- export { CreateManyOptions };
29
30
  //# sourceMappingURL=write-methods.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-methods.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/write-methods.ts"],"mappings":";;;;KAqBY,iBAAA;;;;;;EAMV,SAAA;;;;;;;;;;;;;;EAeA,IAAI;AAAA"}
1
+ {"version":3,"file":"write-methods.d.mts","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/write-methods.ts"],"mappings":";;;;;;YAqBY;;;;;;EAMV;;;;;;;;;;;;;;EAeA"}
@@ -157,7 +157,10 @@ async function createManyBulk(ModelClass, chunks) {
157
157
  const results = await driver.insertMany(table, preparedDocuments);
158
158
  models.forEach((model, index) => {
159
159
  const result = results[index];
160
- if (result) mergeDriverFields(model, "document" in result ? result.document : result);
160
+ if (result) {
161
+ const returnedDocument = "document" in result ? result.document : result;
162
+ mergeDriverFields(model, returnedDocument);
163
+ }
161
164
  model.dirtyTracker.reset();
162
165
  model.isNew = false;
163
166
  });
@@ -190,7 +193,7 @@ async function upsertRecord(ModelClass, filter, data, options) {
190
193
  const setData = { ...tempModel.data };
191
194
  const setOnInsert = {};
192
195
  const now = /* @__PURE__ */ new Date();
193
- for (const key of new Set([
196
+ for (const key of /* @__PURE__ */ new Set([
194
197
  "id",
195
198
  "_id",
196
199
  ModelClass.primaryKey
@@ -1 +1 @@
1
- {"version":3,"file":"write-methods.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/write-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\nimport type { InsertResult, WriterOptions } from \"../../contracts\";\nimport type { ChildModel, Model, ModelSchema } from \"../model\";\nimport { mergeDriverFields } from \"./accessor-methods\";\nimport { sanitizeFilter } from \"../../utils/sanitize-filter\";\nimport { emitModelEvent } from \"./instance-event-methods\";\n\n/**\n * Default number of rows processed per chunk by {@link createManyRecords}.\n *\n * Chunking keeps a single huge `createMany` call from flooding the driver:\n * the default path runs each chunk's `save()` calls under one `Promise.all`,\n * and the bulk path emits one multi-row `insertMany` per chunk so the\n * generated `INSERT ... VALUES (...),(...)` stays under the database's bind\n * parameter ceiling.\n */\nexport const DEFAULT_CREATE_MANY_BATCH_SIZE = 500;\n\n/**\n * Options for {@link createManyRecords} (and `Model.createMany`).\n */\nexport type CreateManyOptions = {\n /**\n * Number of rows processed per chunk.\n *\n * @default 500 ({@link DEFAULT_CREATE_MANY_BATCH_SIZE})\n */\n batchSize?: number;\n\n /**\n * Route each chunk through the driver's native multi-row insert\n * (`insertMany`) instead of per-row `save()`.\n *\n * **Tradeoff:** the bulk path is 10–100× faster for large arrays but\n * SKIPS the per-row lifecycle: `saving` / `creating` / `created` / `saved`\n * events, instance hooks, and sync operations are NOT emitted. Casts,\n * timestamps, defaults and id-generation that the writer normally applies\n * ARE still applied (the rows are prepped through the same writer pipeline),\n * so persisted columns match the default path.\n *\n * @default false\n */\n bulk?: boolean;\n};\n\nexport async function saveModel<TModel extends Model>(\n model: TModel,\n options?: WriterOptions & { merge?: Partial<ModelSchema> },\n): Promise<TModel> {\n if (options?.merge) {\n model.merge(options.merge);\n }\n const writer = new DatabaseWriter(model);\n await writer.save(options);\n return model;\n}\n\nexport async function createRecord<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(ModelClass: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel> {\n const model = new ModelClass(data);\n await model.save();\n return model;\n}\n\n/**\n * Split an array into sequential chunks of at most `size` elements.\n *\n * @param items - The array to split.\n * @param size - Maximum chunk length (callers pass a value `>= 1`).\n * @returns An array of chunks preserving the original order.\n */\nfunction chunkArray<TItem>(items: TItem[], size: number): TItem[][] {\n const chunks: TItem[][] = [];\n\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size));\n }\n\n return chunks;\n}\n\n/**\n * Create many records, chunking the work so a huge array can't overwhelm the\n * driver.\n *\n * Two strategies are available via `options.bulk`:\n *\n * - **Default (`bulk` falsy):** each row is persisted through `save()`, so\n * model hooks, lifecycle events, casts and generated ids are all preserved.\n * Rows are processed in sequential chunks of `batchSize`, each chunk running\n * under a single `Promise.all`, so an array of millions of rows can't open\n * millions of concurrent inserts at once.\n *\n * - **Bulk (`bulk: true`):** each chunk is routed to the driver's native\n * multi-row insert (`insertMany`) for 10–100× throughput. This SKIPS the\n * per-row save lifecycle (no `saving` / `creating` / `created` / `saved`\n * events, hooks, or sync). Rows are still prepped through the writer\n * pipeline (validation, casting, timestamps, defaults, id-generation) so the\n * persisted columns match the default path, and the values returned by the\n * driver (generated `_id`, timestamps, SQL `RETURNING *`) are merged back\n * onto the returned models.\n *\n * Both strategies return the created model instances (an empty array is a\n * no-op that never touches the driver).\n *\n * @param ModelClass - The model class to create records for.\n * @param data - The rows to insert.\n * @param options - Chunking / bulk options.\n * @returns The created model instances.\n *\n * @example\n * ```typescript\n * // Default: per-row save(), chunked in batches of 500\n * const users = await User.createMany(rows);\n *\n * // Bulk: one multi-row INSERT per 1000-row chunk (skips per-row hooks)\n * const users = await User.createMany(rows, { bulk: true, batchSize: 1000 });\n * ```\n */\nexport async function createManyRecords<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(\n ModelClass: ChildModel<TModel>,\n data: Partial<TSchema>[],\n options: CreateManyOptions = {},\n): Promise<TModel[]> {\n if (data.length === 0) {\n return [];\n }\n\n const batchSize =\n options.batchSize && options.batchSize > 0 ? options.batchSize : DEFAULT_CREATE_MANY_BATCH_SIZE;\n\n const chunks = chunkArray(data, batchSize);\n\n if (options.bulk === true) {\n return await createManyBulk(ModelClass, chunks);\n }\n\n const created: TModel[] = [];\n\n for (const chunk of chunks) {\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\n\n // Reserve one contiguous id block for the whole chunk (1 counter op instead\n // of N), pre-seeding each id-less model so its per-row save() no-ops id-gen.\n await assignIdBlock(ModelClass, models);\n\n const chunkModels = await Promise.all(\n models.map(async (model) => {\n await model.save();\n return model;\n }),\n );\n\n created.push(...chunkModels);\n }\n\n return created;\n}\n\n/**\n * Reserve a single contiguous id block for one chunk and pre-assign the ids to\n * the models that don't already carry one, so the per-row writer's id\n * generation no-ops (its `model.get(\"id\")` guard short-circuits). This turns N\n * per-row counter round-trips into ONE per chunk.\n *\n * Falls back to per-row generation (a no-op here) when:\n * - the model disables auto-generation (`autoGenerateId === false`) — e.g. SQL,\n * which uses native `SERIAL`;\n * - the data source's id generator has no batch API (`generateNextIds`) — the\n * optional contract member is feature-detected;\n * - the model uses a random initial id / increment — a random stride can't form\n * a contiguous block, so those models keep per-row generation.\n *\n * Only models WITHOUT a caller-supplied id consume a block slot, so a chunk\n * mixing supplied and auto ids allocates exactly the right number (no gaps).\n *\n * @param ModelClass - The model class being inserted.\n * @param models - The freshly-constructed (unsaved) models for one chunk.\n */\nasync function assignIdBlock<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n models: TModel[],\n): Promise<void> {\n if (!ModelClass.autoGenerateId || ModelClass.randomInitialId || ModelClass.randomIncrement) {\n return;\n }\n\n const idGenerator = ModelClass.getDataSource().idGenerator;\n\n if (!idGenerator || typeof idGenerator.generateNextIds !== \"function\") {\n return;\n }\n\n const idLessModels = models.filter((model) => !model.get(\"id\"));\n\n if (idLessModels.length === 0) {\n return;\n }\n\n const ids = await idGenerator.generateNextIds({\n table: ModelClass.table,\n initialId: ModelClass.initialId || 1,\n incrementIdBy: ModelClass.incrementIdBy || 1,\n count: idLessModels.length,\n });\n\n // Enforce the contract at this pluggable, feature-detected boundary: a\n // non-conforming generator returning the wrong count would otherwise set\n // `id = undefined` on the unmatched rows, the per-row writer would silently\n // re-generate single ids, and the reserved block would no longer match what\n // is persisted. Fail loud instead of corrupting the sequence.\n if (ids.length !== idLessModels.length) {\n throw new Error(\n `generateNextIds returned ${ids.length} id(s) for ${idLessModels.length} row(s) on ` +\n `\"${ModelClass.table}\" — a batch id generator must return exactly the requested count.`,\n );\n }\n\n idLessModels.forEach((model, index) => {\n model.set(\"id\", ids[index]);\n });\n}\n\n/**\n * Bulk variant of {@link createManyRecords}: prep each row through the writer\n * pipeline (validation, casting, timestamps, defaults, id-generation) without\n * touching the database, then flush each chunk with a single\n * `driver.insertMany` call.\n *\n * The writer reuse goes through `DatabaseWriter.prepareForInsert()`, the same\n * pipeline `save()` uses for an insert, so the shared driver is never mutated\n * and concurrent `save()` calls are unaffected.\n *\n * @param ModelClass - The model class to create records for.\n * @param chunks - Pre-chunked rows.\n * @returns The created model instances with driver-returned values merged in.\n */\nasync function createManyBulk<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(ModelClass: ChildModel<TModel>, chunks: Partial<TSchema>[][]): Promise<TModel[]> {\n const dataSource = ModelClass.getDataSource();\n const driver = dataSource.driver;\n const table = ModelClass.table;\n\n const created: TModel[] = [];\n\n {\n for (const chunk of chunks) {\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\n\n // Reserve one contiguous id block for the whole chunk (1 counter op\n // instead of N), pre-seeding each id-less model so the per-row writer's\n // id generation no-ops.\n await assignIdBlock(ModelClass, models);\n\n // Prep every model through the real writer pipeline. The captured\n // `insert` keeps this off the wire while still mutating each model's\n // data with casts/timestamps/defaults/generated ids.\n const preparedDocuments = await Promise.all(\n models.map(async (model) => {\n const document = await new DatabaseWriter(model).prepareForInsert({\n skipEvents: true,\n skipSync: true,\n });\n return { ...document } as Record<string, unknown>;\n }),\n );\n\n const results = await driver.insertMany(table, preparedDocuments);\n\n // Merge driver-returned values (generated _id, timestamps, RETURNING *)\n // back onto each model so the returned instances reflect persisted state.\n models.forEach((model, index) => {\n const result = results[index] as InsertResult | Record<string, unknown> | undefined;\n\n if (result) {\n const returnedDocument =\n \"document\" in (result as Record<string, unknown>)\n ? (result as InsertResult).document\n : result;\n\n // Driver-returned identity (generated _id / RETURNING *) — merged\n // through the framework-internal path so it is not treated as mass\n // assignment on a model the writer has already marked persisted.\n mergeDriverFields(model, returnedDocument as Record<string, unknown>);\n }\n\n model.dirtyTracker.reset();\n model.isNew = false;\n });\n\n created.push(...models);\n }\n }\n\n return created;\n}\n\nexport async function findOrCreateRecord<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(\n ModelClass: ChildModel<TModel>,\n filter: Partial<TSchema>,\n data: Partial<TSchema>,\n): Promise<TModel> {\n const existing = await ModelClass.first(filter as Record<string, unknown>);\n\n if (existing) {\n return existing;\n }\n\n return await createRecord(ModelClass, { ...filter, ...data } as Partial<TSchema>);\n}\n\nexport async function upsertRecord<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(\n ModelClass: ChildModel<TModel>,\n filter: Partial<TSchema>,\n data: Partial<TSchema>,\n options?: Record<string, unknown>,\n): Promise<TModel> {\n const driver = ModelClass.getDriver();\n const safeFilter = sanitizeFilter(filter as Record<string, unknown>);\n const mergedData = { ...safeFilter, ...data } as Record<string, unknown>;\n\n const tempModel = new ModelClass(mergedData as Partial<TSchema>);\n tempModel.isNew = true;\n\n // One `saving` run against the model itself, so listener changes (slug,\n // createdBy, ...) land in the data that is written.\n await emitModelEvent(tempModel, \"saving\", {\n isInsert: true,\n options,\n mode: \"upsert\",\n });\n\n // Validation, casting and Mongo id generation, same as `create()`.\n await new DatabaseWriter(tempModel).prepareForUpsert();\n\n const setData: Record<string, unknown> = { ...tempModel.data };\n const setOnInsert: Record<string, unknown> = {};\n const now = new Date();\n\n // Identity and creation time belong to the insert only; an existing row\n // keeps its own.\n for (const key of new Set([\"id\", \"_id\", ModelClass.primaryKey])) {\n if (key in setData) {\n setOnInsert[key] = setData[key];\n delete setData[key];\n }\n }\n\n const createdAtColumn = ModelClass.createdAtColumn;\n if (createdAtColumn) {\n setOnInsert[createdAtColumn] = setData[createdAtColumn] ?? now;\n delete setData[createdAtColumn];\n }\n\n const updatedAtColumn = ModelClass.updatedAtColumn;\n if (updatedAtColumn) {\n setData[updatedAtColumn] = now;\n }\n\n const result = await driver.findOneAndUpdate(\n ModelClass.table,\n safeFilter,\n { $set: setData, $setOnInsert: setOnInsert },\n { ...options, upsert: true, returnDocument: \"after\" },\n );\n\n const model = ModelClass.hydrate(result as Record<string, unknown>) as TModel;\n model.dirtyTracker.reset();\n\n await emitModelEvent(model, \"saved\", {\n filter: safeFilter,\n data: result,\n options,\n mode: \"upsert\",\n });\n\n return model;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"write-methods.mjs","names":[],"sources":["../../../../../../../../../packages/cascade/src/model/methods/write-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\nimport type { InsertResult, WriterOptions } from \"../../contracts\";\nimport type { ChildModel, Model, ModelSchema } from \"../model\";\nimport { mergeDriverFields } from \"./accessor-methods\";\nimport { sanitizeFilter } from \"../../utils/sanitize-filter\";\nimport { emitModelEvent } from \"./instance-event-methods\";\n\n/**\n * Default number of rows processed per chunk by {@link createManyRecords}.\n *\n * Chunking keeps a single huge `createMany` call from flooding the driver:\n * the default path runs each chunk's `save()` calls under one `Promise.all`,\n * and the bulk path emits one multi-row `insertMany` per chunk so the\n * generated `INSERT ... VALUES (...),(...)` stays under the database's bind\n * parameter ceiling.\n */\nexport const DEFAULT_CREATE_MANY_BATCH_SIZE = 500;\n\n/**\n * Options for {@link createManyRecords} (and `Model.createMany`).\n */\nexport type CreateManyOptions = {\n /**\n * Number of rows processed per chunk.\n *\n * @default 500 ({@link DEFAULT_CREATE_MANY_BATCH_SIZE})\n */\n batchSize?: number;\n\n /**\n * Route each chunk through the driver's native multi-row insert\n * (`insertMany`) instead of per-row `save()`.\n *\n * **Tradeoff:** the bulk path is 10–100× faster for large arrays but\n * SKIPS the per-row lifecycle: `saving` / `creating` / `created` / `saved`\n * events, instance hooks, and sync operations are NOT emitted. Casts,\n * timestamps, defaults and id-generation that the writer normally applies\n * ARE still applied (the rows are prepped through the same writer pipeline),\n * so persisted columns match the default path.\n *\n * @default false\n */\n bulk?: boolean;\n};\n\nexport async function saveModel<TModel extends Model>(\n model: TModel,\n options?: WriterOptions & { merge?: Partial<ModelSchema> },\n): Promise<TModel> {\n if (options?.merge) {\n model.merge(options.merge);\n }\n const writer = new DatabaseWriter(model);\n await writer.save(options);\n return model;\n}\n\nexport async function createRecord<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(ModelClass: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel> {\n const model = new ModelClass(data);\n await model.save();\n return model;\n}\n\n/**\n * Split an array into sequential chunks of at most `size` elements.\n *\n * @param items - The array to split.\n * @param size - Maximum chunk length (callers pass a value `>= 1`).\n * @returns An array of chunks preserving the original order.\n */\nfunction chunkArray<TItem>(items: TItem[], size: number): TItem[][] {\n const chunks: TItem[][] = [];\n\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size));\n }\n\n return chunks;\n}\n\n/**\n * Create many records, chunking the work so a huge array can't overwhelm the\n * driver.\n *\n * Two strategies are available via `options.bulk`:\n *\n * - **Default (`bulk` falsy):** each row is persisted through `save()`, so\n * model hooks, lifecycle events, casts and generated ids are all preserved.\n * Rows are processed in sequential chunks of `batchSize`, each chunk running\n * under a single `Promise.all`, so an array of millions of rows can't open\n * millions of concurrent inserts at once.\n *\n * - **Bulk (`bulk: true`):** each chunk is routed to the driver's native\n * multi-row insert (`insertMany`) for 10–100× throughput. This SKIPS the\n * per-row save lifecycle (no `saving` / `creating` / `created` / `saved`\n * events, hooks, or sync). Rows are still prepped through the writer\n * pipeline (validation, casting, timestamps, defaults, id-generation) so the\n * persisted columns match the default path, and the values returned by the\n * driver (generated `_id`, timestamps, SQL `RETURNING *`) are merged back\n * onto the returned models.\n *\n * Both strategies return the created model instances (an empty array is a\n * no-op that never touches the driver).\n *\n * @param ModelClass - The model class to create records for.\n * @param data - The rows to insert.\n * @param options - Chunking / bulk options.\n * @returns The created model instances.\n *\n * @example\n * ```typescript\n * // Default: per-row save(), chunked in batches of 500\n * const users = await User.createMany(rows);\n *\n * // Bulk: one multi-row INSERT per 1000-row chunk (skips per-row hooks)\n * const users = await User.createMany(rows, { bulk: true, batchSize: 1000 });\n * ```\n */\nexport async function createManyRecords<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(\n ModelClass: ChildModel<TModel>,\n data: Partial<TSchema>[],\n options: CreateManyOptions = {},\n): Promise<TModel[]> {\n if (data.length === 0) {\n return [];\n }\n\n const batchSize =\n options.batchSize && options.batchSize > 0 ? options.batchSize : DEFAULT_CREATE_MANY_BATCH_SIZE;\n\n const chunks = chunkArray(data, batchSize);\n\n if (options.bulk === true) {\n return await createManyBulk(ModelClass, chunks);\n }\n\n const created: TModel[] = [];\n\n for (const chunk of chunks) {\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\n\n // Reserve one contiguous id block for the whole chunk (1 counter op instead\n // of N), pre-seeding each id-less model so its per-row save() no-ops id-gen.\n await assignIdBlock(ModelClass, models);\n\n const chunkModels = await Promise.all(\n models.map(async (model) => {\n await model.save();\n return model;\n }),\n );\n\n created.push(...chunkModels);\n }\n\n return created;\n}\n\n/**\n * Reserve a single contiguous id block for one chunk and pre-assign the ids to\n * the models that don't already carry one, so the per-row writer's id\n * generation no-ops (its `model.get(\"id\")` guard short-circuits). This turns N\n * per-row counter round-trips into ONE per chunk.\n *\n * Falls back to per-row generation (a no-op here) when:\n * - the model disables auto-generation (`autoGenerateId === false`) — e.g. SQL,\n * which uses native `SERIAL`;\n * - the data source's id generator has no batch API (`generateNextIds`) — the\n * optional contract member is feature-detected;\n * - the model uses a random initial id / increment — a random stride can't form\n * a contiguous block, so those models keep per-row generation.\n *\n * Only models WITHOUT a caller-supplied id consume a block slot, so a chunk\n * mixing supplied and auto ids allocates exactly the right number (no gaps).\n *\n * @param ModelClass - The model class being inserted.\n * @param models - The freshly-constructed (unsaved) models for one chunk.\n */\nasync function assignIdBlock<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n models: TModel[],\n): Promise<void> {\n if (!ModelClass.autoGenerateId || ModelClass.randomInitialId || ModelClass.randomIncrement) {\n return;\n }\n\n const idGenerator = ModelClass.getDataSource().idGenerator;\n\n if (!idGenerator || typeof idGenerator.generateNextIds !== \"function\") {\n return;\n }\n\n const idLessModels = models.filter((model) => !model.get(\"id\"));\n\n if (idLessModels.length === 0) {\n return;\n }\n\n const ids = await idGenerator.generateNextIds({\n table: ModelClass.table,\n initialId: ModelClass.initialId || 1,\n incrementIdBy: ModelClass.incrementIdBy || 1,\n count: idLessModels.length,\n });\n\n // Enforce the contract at this pluggable, feature-detected boundary: a\n // non-conforming generator returning the wrong count would otherwise set\n // `id = undefined` on the unmatched rows, the per-row writer would silently\n // re-generate single ids, and the reserved block would no longer match what\n // is persisted. Fail loud instead of corrupting the sequence.\n if (ids.length !== idLessModels.length) {\n throw new Error(\n `generateNextIds returned ${ids.length} id(s) for ${idLessModels.length} row(s) on ` +\n `\"${ModelClass.table}\" — a batch id generator must return exactly the requested count.`,\n );\n }\n\n idLessModels.forEach((model, index) => {\n model.set(\"id\", ids[index]);\n });\n}\n\n/**\n * Bulk variant of {@link createManyRecords}: prep each row through the writer\n * pipeline (validation, casting, timestamps, defaults, id-generation) without\n * touching the database, then flush each chunk with a single\n * `driver.insertMany` call.\n *\n * The writer reuse goes through `DatabaseWriter.prepareForInsert()`, the same\n * pipeline `save()` uses for an insert, so the shared driver is never mutated\n * and concurrent `save()` calls are unaffected.\n *\n * @param ModelClass - The model class to create records for.\n * @param chunks - Pre-chunked rows.\n * @returns The created model instances with driver-returned values merged in.\n */\nasync function createManyBulk<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(ModelClass: ChildModel<TModel>, chunks: Partial<TSchema>[][]): Promise<TModel[]> {\n const dataSource = ModelClass.getDataSource();\n const driver = dataSource.driver;\n const table = ModelClass.table;\n\n const created: TModel[] = [];\n\n {\n for (const chunk of chunks) {\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\n\n // Reserve one contiguous id block for the whole chunk (1 counter op\n // instead of N), pre-seeding each id-less model so the per-row writer's\n // id generation no-ops.\n await assignIdBlock(ModelClass, models);\n\n // Prep every model through the real writer pipeline. The captured\n // `insert` keeps this off the wire while still mutating each model's\n // data with casts/timestamps/defaults/generated ids.\n const preparedDocuments = await Promise.all(\n models.map(async (model) => {\n const document = await new DatabaseWriter(model).prepareForInsert({\n skipEvents: true,\n skipSync: true,\n });\n return { ...document } as Record<string, unknown>;\n }),\n );\n\n const results = await driver.insertMany(table, preparedDocuments);\n\n // Merge driver-returned values (generated _id, timestamps, RETURNING *)\n // back onto each model so the returned instances reflect persisted state.\n models.forEach((model, index) => {\n const result = results[index] as InsertResult | Record<string, unknown> | undefined;\n\n if (result) {\n const returnedDocument =\n \"document\" in (result as Record<string, unknown>)\n ? (result as InsertResult).document\n : result;\n\n // Driver-returned identity (generated _id / RETURNING *) — merged\n // through the framework-internal path so it is not treated as mass\n // assignment on a model the writer has already marked persisted.\n mergeDriverFields(model, returnedDocument as Record<string, unknown>);\n }\n\n model.dirtyTracker.reset();\n model.isNew = false;\n });\n\n created.push(...models);\n }\n }\n\n return created;\n}\n\nexport async function findOrCreateRecord<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(\n ModelClass: ChildModel<TModel>,\n filter: Partial<TSchema>,\n data: Partial<TSchema>,\n): Promise<TModel> {\n const existing = await ModelClass.first(filter as Record<string, unknown>);\n\n if (existing) {\n return existing;\n }\n\n return await createRecord(ModelClass, { ...filter, ...data } as Partial<TSchema>);\n}\n\nexport async function upsertRecord<\n TModel extends Model,\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\n>(\n ModelClass: ChildModel<TModel>,\n filter: Partial<TSchema>,\n data: Partial<TSchema>,\n options?: Record<string, unknown>,\n): Promise<TModel> {\n const driver = ModelClass.getDriver();\n const safeFilter = sanitizeFilter(filter as Record<string, unknown>);\n const mergedData = { ...safeFilter, ...data } as Record<string, unknown>;\n\n const tempModel = new ModelClass(mergedData as Partial<TSchema>);\n tempModel.isNew = true;\n\n // One `saving` run against the model itself, so listener changes (slug,\n // createdBy, ...) land in the data that is written.\n await emitModelEvent(tempModel, \"saving\", {\n isInsert: true,\n options,\n mode: \"upsert\",\n });\n\n // Validation, casting and Mongo id generation, same as `create()`.\n await new DatabaseWriter(tempModel).prepareForUpsert();\n\n const setData: Record<string, unknown> = { ...tempModel.data };\n const setOnInsert: Record<string, unknown> = {};\n const now = new Date();\n\n // Identity and creation time belong to the insert only; an existing row\n // keeps its own.\n for (const key of new Set([\"id\", \"_id\", ModelClass.primaryKey])) {\n if (key in setData) {\n setOnInsert[key] = setData[key];\n delete setData[key];\n }\n }\n\n const createdAtColumn = ModelClass.createdAtColumn;\n if (createdAtColumn) {\n setOnInsert[createdAtColumn] = setData[createdAtColumn] ?? now;\n delete setData[createdAtColumn];\n }\n\n const updatedAtColumn = ModelClass.updatedAtColumn;\n if (updatedAtColumn) {\n setData[updatedAtColumn] = now;\n }\n\n const result = await driver.findOneAndUpdate(\n ModelClass.table,\n safeFilter,\n { $set: setData, $setOnInsert: setOnInsert },\n { ...options, upsert: true, returnDocument: \"after\" },\n );\n\n const model = ModelClass.hydrate(result as Record<string, unknown>) as TModel;\n model.dirtyTracker.reset();\n\n await emitModelEvent(model, \"saved\", {\n filter: safeFilter,\n data: result,\n options,\n mode: \"upsert\",\n });\n\n return model;\n}\n"],"mappings":"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"}
@@ -1,20 +1,20 @@
1
1
  import { DeleteStrategy, StrictMode } from "../types.mjs";
2
2
  import { DatabaseDirtyTracker } from "../database-dirty-tracker.mjs";
3
- import { ChildModel, GlobalScopeDefinition, GlobalScopeOptions, LocalScopeCallback, ModelSchema, ScopeTiming } from "./model.types.mjs";
4
3
  import { ModelEventListener, ModelEventName, ModelEvents } from "../events/model-events.mjs";
5
4
  import { LoadedRelationResult, PivotData, PivotIds, RelationDefinition } from "../relations/types.mjs";
6
5
  import { PivotOperations } from "../relations/pivot-operations.mjs";
7
6
  import { ModelSnapshot } from "../relations/relation-hydrator.mjs";
8
7
  import { ModelSyncOperationContract } from "../sync/types.mjs";
9
8
  import { CreateManyOptions } from "./methods/write-methods.mjs";
9
+ import { ChildModel, GlobalScopeDefinition, GlobalScopeOptions, LocalScopeCallback, ModelSchema, ScopeTiming } from "./model.types.mjs";
10
10
  import { PaginationOptions, PaginationResult, QueryBuilderContract, RawExpression, WhereCallback, WhereObject, WhereOperator } from "../contracts/query-builder.contract.mjs";
11
11
  import { AtomicUpdate, AtomicUpdateOptions, DriverContract, FindOneAndUpdateOptions, RawQueryResult } from "../contracts/database-driver.contract.mjs";
12
12
  import { RemoverResult } from "../contracts/database-remover.contract.mjs";
13
13
  import { WriterOptions } from "../contracts/database-writer.contract.mjs";
14
+ import "../contracts/index.mjs";
14
15
  import { DataSource } from "../data-source/data-source.mjs";
15
16
  import { GenericObject } from "@mongez/reinforcements";
16
17
  import { ObjectValidator } from "@warlock.js/seal";
17
-
18
18
  //#region ../../packages/cascade/src/model/model.d.ts
19
19
  /**
20
20
  * Base class that powers all Cascade models.
@@ -45,7 +45,7 @@ import { ObjectValidator } from "@warlock.js/seal";
45
45
  * console.log(user.hasChanges()); // true
46
46
  * ```
47
47
  */
48
- declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
48
+ export declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
49
49
  /**
50
50
  * The database table or collection name associated with this model.
51
51
  *
@@ -1564,7 +1564,7 @@ declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
1564
1564
  * // Type: User (with UserSchema inferred)
1565
1565
  * ```
1566
1566
  */
1567
- static create<TModel extends Model = Model, TSchema extends ModelSchema = (TModel extends Model<infer S> ? S : ModelSchema)>(this: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel>;
1567
+ static create<TModel extends Model = Model, TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema>(this: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel>;
1568
1568
  /**
1569
1569
  * Create many records and return an array of created models.
1570
1570
  *
@@ -1597,7 +1597,7 @@ declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
1597
1597
  * const users = await User.createMany(rows, { bulk: true, batchSize: 1000 });
1598
1598
  * ```
1599
1599
  */
1600
- static createMany<TModel extends Model = Model, TSchema extends ModelSchema = (TModel extends Model<infer S> ? S : ModelSchema)>(this: ChildModel<TModel>, data: Partial<TSchema>[], options?: CreateManyOptions): Promise<TModel[]>;
1600
+ static createMany<TModel extends Model = Model, TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema>(this: ChildModel<TModel>, data: Partial<TSchema>[], options?: CreateManyOptions): Promise<TModel[]>;
1601
1601
  /**
1602
1602
  * Find a record or create it if not found.
1603
1603
  *
@@ -1619,7 +1619,7 @@ declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
1619
1619
  * // If not found, creates new admin
1620
1620
  * ```
1621
1621
  */
1622
- static findOrCreate<TModel extends Model = Model, TSchema extends ModelSchema = (TModel extends Model<infer S> ? S : ModelSchema)>(this: ChildModel<TModel>, filter: Partial<TSchema>, data: Partial<TSchema>): Promise<TModel>;
1622
+ static findOrCreate<TModel extends Model = Model, TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema>(this: ChildModel<TModel>, filter: Partial<TSchema>, data: Partial<TSchema>): Promise<TModel>;
1623
1623
  /**
1624
1624
  * Upsert (insert or update) a record atomically.
1625
1625
  *
@@ -1662,7 +1662,7 @@ declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
1662
1662
  * );
1663
1663
  * ```
1664
1664
  */
1665
- static upsert<TModel extends Model = Model, TSchema extends ModelSchema = (TModel extends Model<infer S> ? S : ModelSchema)>(this: ChildModel<TModel>, filter: Partial<TSchema>, data: Partial<TSchema>, options?: Record<string, unknown>): Promise<TModel>;
1665
+ static upsert<TModel extends Model = Model, TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema>(this: ChildModel<TModel>, filter: Partial<TSchema>, data: Partial<TSchema>, options?: Record<string, unknown>): Promise<TModel>;
1666
1666
  /**
1667
1667
  * Update a record or create it if not found (upsert).
1668
1668
  *
@@ -1673,7 +1673,7 @@ declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
1673
1673
  * @param data - Data to update or create (merged with filter)
1674
1674
  * @returns Promise resolving to updated or created model
1675
1675
  */
1676
- static updateOrCreate<TModel extends Model = Model, TSchema extends ModelSchema = (TModel extends Model<infer S> ? S : ModelSchema)>(this: ChildModel<TModel>, filter: Partial<TSchema>, data: Partial<TSchema>, options?: Record<string, unknown>): Promise<TModel>;
1676
+ static updateOrCreate<TModel extends Model = Model, TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema>(this: ChildModel<TModel>, filter: Partial<TSchema>, data: Partial<TSchema>, options?: Record<string, unknown>): Promise<TModel>;
1677
1677
  /**
1678
1678
  * Find one and delete a record that matches the filter and return the deleted record.
1679
1679
  *
@@ -1923,5 +1923,5 @@ declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
1923
1923
  toJSON(): Record<string, unknown>;
1924
1924
  }
1925
1925
  //#endregion
1926
- export { Model };
1926
+ export type { ChildModel, GlobalScopeDefinition, GlobalScopeOptions, LocalScopeCallback, ModelSchema, ScopeTiming };
1927
1927
  //# sourceMappingURL=model.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/model/model.ts"],"mappings":"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"}
1
+ {"version":3,"file":"model.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/model/model.ts"],"mappings":"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"}
@@ -1,31 +1,32 @@
1
1
  import { Model } from "./model.mjs";
2
2
  import { QueryBuilderContract } from "../contracts/query-builder.contract.mjs";
3
+ import "../contracts/index.mjs";
3
4
  //#region ../../packages/cascade/src/model/model.types.d.ts
4
5
  /**
5
6
  * Timing control for global scopes
6
7
  */
7
- type ScopeTiming = "before" | "after";
8
+ export type ScopeTiming = "before" | "after";
8
9
  /**
9
10
  * Global scope definition with callback and timing
10
11
  */
11
- type GlobalScopeDefinition = {
12
+ export type GlobalScopeDefinition = {
12
13
  callback: (query: QueryBuilderContract) => void;
13
14
  timing: ScopeTiming;
14
15
  };
15
16
  /**
16
17
  * Local scope callback function
17
18
  */
18
- type LocalScopeCallback = (query: QueryBuilderContract, ...args: any[]) => void;
19
+ export type LocalScopeCallback = (query: QueryBuilderContract, ...args: any[]) => void;
19
20
  /**
20
21
  * Options for adding global scopes
21
22
  */
22
- type GlobalScopeOptions = {
23
+ export type GlobalScopeOptions = {
23
24
  timing?: ScopeTiming;
24
25
  };
25
26
  /**
26
27
  * Generic schema type representing the structure of model data.
27
28
  */
28
- type ModelSchema = Record<string, any>;
29
+ export type ModelSchema = Record<string, any>;
29
30
  /**
30
31
  * Represents the static side of a model subclass.
31
32
  *
@@ -41,7 +42,6 @@ type ModelSchema = Record<string, any>;
41
42
  * ): Promise<TModel | null>
42
43
  * ```
43
44
  */
44
- type ChildModel<TModel extends Model> = (new (...args: any[]) => TModel) & Pick<typeof Model, "table" | "primaryKey" | "dataSource" | "schema" | "strictMode" | "autoGenerateId" | "initialId" | "randomInitialId" | "incrementIdBy" | "resource" | "resourceColumns" | "toJsonColumns" | "hidden" | "randomIncrement" | "getDataSource" | "getDriver" | "query" | "find" | "first" | "last" | "all" | "latest" | "count" | "where" | "increase" | "decrease" | "atomic" | "events" | "on" | "once" | "off" | "globalEvents" | "delete" | "deleteOne" | "deleteStrategy" | "trashTable" | "restore" | "restoreAll" | "deletedAtColumn" | "createdAtColumn" | "updatedAtColumn" | "create" | "createMany" | "sync" | "embed" | "syncMany" | "addGlobalScope" | "removeGlobalScope" | "addScope" | "removeScope" | "localScopes" | "globalScopes" | "relations" | "newQueryBuilder" | "builder" | "findAndUpdate" | "findOneAndUpdate" | "hydrate" | "fromSnapshot" | "findAndReplace" | "findOneAndDelete" | "findOrCreate">;
45
+ export type ChildModel<TModel extends Model> = (new (...args: any[]) => TModel) & Pick<typeof Model, "table" | "primaryKey" | "dataSource" | "schema" | "strictMode" | "autoGenerateId" | "initialId" | "randomInitialId" | "incrementIdBy" | "resource" | "resourceColumns" | "toJsonColumns" | "hidden" | "randomIncrement" | "getDataSource" | "getDriver" | "query" | "find" | "first" | "last" | "all" | "latest" | "count" | "where" | "increase" | "decrease" | "atomic" | "events" | "on" | "once" | "off" | "globalEvents" | "delete" | "deleteOne" | "deleteStrategy" | "trashTable" | "restore" | "restoreAll" | "deletedAtColumn" | "createdAtColumn" | "updatedAtColumn" | "create" | "createMany" | "sync" | "embed" | "syncMany" | "addGlobalScope" | "removeGlobalScope" | "addScope" | "removeScope" | "localScopes" | "globalScopes" | "relations" | "newQueryBuilder" | "builder" | "findAndUpdate" | "findOneAndUpdate" | "hydrate" | "fromSnapshot" | "findAndReplace" | "findOneAndDelete" | "findOrCreate">;
45
46
  //#endregion
46
- export { ChildModel, GlobalScopeDefinition, GlobalScopeOptions, LocalScopeCallback, ModelSchema, ScopeTiming };
47
47
  //# sourceMappingURL=model.types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.types.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/model/model.types.ts"],"mappings":";;;;;;KAMY,WAAA;;;;KAKA,qBAAA;EACV,QAAA,GAAW,KAAA,EAAO,oBAAA;EAClB,MAAA,EAAQ,WAAW;AAAA;;;;KAMT,kBAAA,IAAsB,KAAA,EAAO,oBAAoB,KAAK,IAAA;;;;KAKtD,kBAAA;EACV,MAAA,GAAS,WAAW;AAAA;;;;KAMV,WAAA,GAAc,MAAM;;;AAZsC;AAKtE;;;;AACsB;AAMtB;;;;AAAgC;AAiBhC;;KAAY,UAAA,gBAA0B,KAAA,aAAkB,IAAA,YAAgB,MAAA,IACtE,IAAA,QACS,KAAA"}
1
+ {"version":3,"file":"model.types.d.mts","names":[],"sources":["../../../../../../../../packages/cascade/src/model/model.types.ts"],"mappings":";;;;;;;YAMY;;;;YAKA;EACV,WAAW,OAAO;EAClB,QAAQ;;;;;YAME,sBAAsB,OAAO,yBAAyB;;;;YAKtD;EACV,SAAS;;;;;YAMC,cAAc;;;;;;;;;;;;;;;;YAiBd,WAAW,eAAe,kBAAkB,gBAAgB,UACtE,YACS"}
@@ -1,7 +1,6 @@
1
1
  import { ChildModel, ModelSchema } from "./model.types.mjs";
2
2
  import { Model } from "./model.mjs";
3
3
  import { Lazy } from "@mongez/reinforcements";
4
-
5
4
  //#region ../../packages/cascade/src/model/register-model.d.ts
6
5
  /**
7
6
  * Any way a relation target can be expressed: a string name registered
@@ -15,11 +14,11 @@ import { Lazy } from "@mongez/reinforcements";
15
14
  * class to `ChildModel<Model>` internally; the user's `lazy(() => X)`
16
15
  * call already guarantees the shape at the source.
17
16
  */
18
- type ModelRef = ChildModel<Model> | string | Lazy<unknown>;
17
+ export type ModelRef = ChildModel<Model> | string | Lazy<unknown>;
19
18
  /**
20
19
  * Options for the RegisterModel decorator
21
20
  */
22
- type RegisterModelOptions = {
21
+ export type RegisterModelOptions = {
23
22
  /**
24
23
  * Custom name for the model in the global registry.
25
24
  * If not provided, uses the class name.
@@ -61,8 +60,8 @@ type RegisterModelOptions = {
61
60
  * const UserModel = getModelFromRegistry("User");
62
61
  * ```
63
62
  */
64
- declare function RegisterModel(options?: RegisterModelOptions): <T extends ChildModel<Model>>(value: T, context: ClassDecoratorContext<T>) => T;
65
- declare function registerModelInRegistry(name: string, model: ChildModel<Model>): void;
63
+ export declare function RegisterModel(options?: RegisterModelOptions): <T extends ChildModel<Model>>(value: T, context: ClassDecoratorContext<T>) => T;
64
+ export declare function registerModelInRegistry(name: string, model: ChildModel<Model>): void;
66
65
  /**
67
66
  * Get a model class by its name from the global registry.
68
67
  *
@@ -77,7 +76,7 @@ declare function registerModelInRegistry(name: string, model: ChildModel<Model>)
77
76
  * }
78
77
  * ```
79
78
  */
80
- declare function getModelFromRegistry(name: string): ChildModel<Model<ModelSchema>> | undefined;
79
+ export declare function getModelFromRegistry(name: string): ChildModel<Model<ModelSchema>> | undefined;
81
80
  /**
82
81
  * Get all registered models from the global registry.
83
82
  *
@@ -91,25 +90,25 @@ declare function getModelFromRegistry(name: string): ChildModel<Model<ModelSchem
91
90
  * }
92
91
  * ```
93
92
  */
94
- declare function getAllModelsFromRegistry(): Map<string, ChildModel<Model<ModelSchema>>>;
93
+ export declare function getAllModelsFromRegistry(): Map<string, ChildModel<Model<ModelSchema>>>;
95
94
  /**
96
95
  * Clean up all models from register
97
96
  */
98
- declare function cleanupModelsRegistery(): void;
99
- declare function removeModelFromRegistery(name: string): void;
100
- declare function resolveModelClass(model: ModelRef): ChildModel<Model>;
97
+ export declare function cleanupModelsRegistery(): void;
98
+ export declare function removeModelFromRegistery(name: string): void;
99
+ export declare function resolveModelClass(model: ModelRef): ChildModel<Model>;
101
100
  /**
102
101
  * Like `resolveModelClass`, but throws a descriptive error when a string
103
102
  * ref isn't registered instead of returning `undefined`.
104
103
  */
105
- declare function requireModelClass(model: ModelRef): ChildModel<Model>;
104
+ export declare function requireModelClass(model: ModelRef): ChildModel<Model>;
106
105
  /**
107
106
  * Like `resolveModelClass`, but returns `undefined` instead of asserting
108
107
  * a non-null result when a string ref isn't in the registry. Use this
109
108
  * at call sites that already handle the missing-model case explicitly
110
109
  * (e.g. join builders that throw their own contextual error).
111
110
  */
112
- declare function tryResolveModelClass(model: ModelRef | undefined): ChildModel<Model> | undefined;
111
+ export declare function tryResolveModelClass(model: ModelRef | undefined): ChildModel<Model> | undefined;
113
112
  /**
114
113
  * Read the model's registered name from any `ModelRef`. Used by
115
114
  * convention helpers (`inferPivotTable`, `inferPivotKey`) that derive
@@ -119,7 +118,7 @@ declare function tryResolveModelClass(model: ModelRef | undefined): ChildModel<M
119
118
  * the class's `.name` is returned — same string the registry would
120
119
  * key the class under, so conventions stay consistent across ref shapes.
121
120
  */
122
- declare function resolveModelName(model: ModelRef): string;
121
+ export declare function resolveModelName(model: ModelRef): string;
123
122
  /**
124
123
  * Walk every registered model and verify that every relation declared on it
125
124
  * points at another registered model. Throws fast at boot with a clear error
@@ -139,7 +138,6 @@ declare function resolveModelName(model: ModelRef): string;
139
138
  * verifyRegisteredRelations();
140
139
  * ```
141
140
  */
142
- declare function verifyRegisteredRelations(): number;
141
+ export declare function verifyRegisteredRelations(): number;
143
142
  //#endregion
144
- export { ModelRef, RegisterModel, RegisterModelOptions, cleanupModelsRegistery, getAllModelsFromRegistry, getModelFromRegistry, registerModelInRegistry, removeModelFromRegistery, requireModelClass, resolveModelClass, resolveModelName, tryResolveModelClass, verifyRegisteredRelations };
145
143
  //# sourceMappingURL=register-model.d.mts.map