@rvoh/dream 0.40.4 → 0.40.6

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 (186) hide show
  1. package/dist/cjs/src/Dream.js +64 -12
  2. package/dist/cjs/src/dream/DreamClassTransactionBuilder.js +46 -6
  3. package/dist/cjs/src/dream/DreamInstanceTransactionBuilder.js +2 -2
  4. package/dist/cjs/src/dream/LeftJoinLoadBuilder.js +3 -3
  5. package/dist/cjs/src/dream/LoadBuilder.js +3 -3
  6. package/dist/cjs/src/dream/internal/associations/createAssociation.js +1 -6
  7. package/dist/cjs/src/dream/internal/destroyDream.js +1 -1
  8. package/dist/cjs/src/dream/internal/findOrCreateBy.js +16 -0
  9. package/dist/cjs/src/dream/internal/runHooksFor.js +4 -4
  10. package/dist/cjs/src/dream/internal/saveDream.js +1 -1
  11. package/dist/cjs/src/dream/internal/updateOrCreateBy.js +18 -0
  12. package/dist/cjs/src/errors/CreateOrUpdateByFailedToCreateAndUpdate.js +18 -0
  13. package/dist/esm/src/Dream.js +64 -12
  14. package/dist/esm/src/dream/DreamClassTransactionBuilder.js +46 -6
  15. package/dist/esm/src/dream/DreamInstanceTransactionBuilder.js +2 -2
  16. package/dist/esm/src/dream/LeftJoinLoadBuilder.js +3 -3
  17. package/dist/esm/src/dream/LoadBuilder.js +3 -3
  18. package/dist/esm/src/dream/internal/associations/createAssociation.js +1 -6
  19. package/dist/esm/src/dream/internal/destroyDream.js +1 -1
  20. package/dist/esm/src/dream/internal/findOrCreateBy.js +13 -0
  21. package/dist/esm/src/dream/internal/runHooksFor.js +4 -4
  22. package/dist/esm/src/dream/internal/saveDream.js +1 -1
  23. package/dist/esm/src/dream/internal/updateOrCreateBy.js +15 -0
  24. package/dist/esm/src/errors/CreateOrUpdateByFailedToCreateAndUpdate.js +15 -0
  25. package/dist/types/src/Dream.d.ts +42 -9
  26. package/dist/types/src/dream/DreamClassTransactionBuilder.d.ts +72 -37
  27. package/dist/types/src/dream/DreamInstanceTransactionBuilder.d.ts +3 -3
  28. package/dist/types/src/dream/LeftJoinLoadBuilder.d.ts +2 -2
  29. package/dist/types/src/dream/LoadBuilder.d.ts +2 -2
  30. package/dist/types/src/dream/Query.d.ts +1 -1
  31. package/dist/types/src/dream/internal/findOrCreateBy.d.ts +4 -0
  32. package/dist/types/src/dream/internal/runHooksFor.d.ts +2 -2
  33. package/dist/types/src/dream/internal/updateOrCreateBy.d.ts +4 -0
  34. package/dist/types/src/errors/CreateOrUpdateByFailedToCreateAndUpdate.d.ts +6 -0
  35. package/dist/types/src/types/dream.d.ts +7 -0
  36. package/dist/types/src/types/dream.ts +9 -0
  37. package/docs/assets/search.js +1 -1
  38. package/docs/classes/Benchmark.html +2 -2
  39. package/docs/classes/CalendarDate.html +2 -2
  40. package/docs/classes/CreateOrFindByFailedToCreateAndFind.html +3 -3
  41. package/docs/classes/Decorators.html +19 -19
  42. package/docs/classes/Dream.html +205 -185
  43. package/docs/classes/DreamApp.html +4 -4
  44. package/docs/classes/DreamBin.html +2 -2
  45. package/docs/classes/DreamCLI.html +4 -4
  46. package/docs/classes/DreamImporter.html +2 -2
  47. package/docs/classes/DreamLogos.html +2 -2
  48. package/docs/classes/DreamMigrationHelpers.html +7 -7
  49. package/docs/classes/DreamSerializer.html +2 -2
  50. package/docs/classes/DreamTransaction.html +2 -2
  51. package/docs/classes/Encrypt.html +2 -2
  52. package/docs/classes/Env.html +2 -2
  53. package/docs/classes/GlobalNameNotSet.html +3 -3
  54. package/docs/classes/NonLoadedAssociation.html +3 -3
  55. package/docs/classes/Query.html +51 -51
  56. package/docs/classes/Range.html +2 -2
  57. package/docs/classes/RecordNotFound.html +3 -3
  58. package/docs/classes/ValidationError.html +3 -3
  59. package/docs/functions/Attribute.html +1 -1
  60. package/docs/functions/RendersMany.html +1 -1
  61. package/docs/functions/RendersOne.html +1 -1
  62. package/docs/functions/ReplicaSafe.html +1 -1
  63. package/docs/functions/STI.html +1 -1
  64. package/docs/functions/SoftDelete.html +1 -1
  65. package/docs/functions/camelize.html +1 -1
  66. package/docs/functions/capitalize.html +1 -1
  67. package/docs/functions/closeAllDbConnections.html +1 -1
  68. package/docs/functions/compact.html +1 -1
  69. package/docs/functions/dreamDbConnections.html +1 -1
  70. package/docs/functions/dreamPath.html +1 -1
  71. package/docs/functions/generateDream.html +1 -1
  72. package/docs/functions/globalClassNameFromFullyQualifiedModelName.html +1 -1
  73. package/docs/functions/hyphenize.html +1 -1
  74. package/docs/functions/inferSerializerFromDreamClassOrViewModelClass.html +1 -1
  75. package/docs/functions/inferSerializerFromDreamOrViewModel.html +1 -1
  76. package/docs/functions/isEmpty.html +1 -1
  77. package/docs/functions/loadRepl.html +1 -1
  78. package/docs/functions/lookupClassByGlobalName.html +1 -1
  79. package/docs/functions/pascalize.html +1 -1
  80. package/docs/functions/pgErrorType.html +1 -1
  81. package/docs/functions/range-1.html +1 -1
  82. package/docs/functions/relativeDreamPath.html +1 -1
  83. package/docs/functions/round.html +1 -1
  84. package/docs/functions/serializerNameFromFullyQualifiedModelName.html +1 -1
  85. package/docs/functions/sharedPathPrefix.html +1 -1
  86. package/docs/functions/snakeify.html +1 -1
  87. package/docs/functions/sort.html +1 -1
  88. package/docs/functions/sortBy.html +1 -1
  89. package/docs/functions/standardizeFullyQualifiedModelName.html +1 -1
  90. package/docs/functions/uncapitalize.html +1 -1
  91. package/docs/functions/uniq.html +1 -1
  92. package/docs/functions/untypedDb.html +1 -1
  93. package/docs/functions/validateColumn.html +1 -1
  94. package/docs/functions/validateTable.html +1 -1
  95. package/docs/interfaces/AttributeStatement.html +2 -2
  96. package/docs/interfaces/DecoratorContext.html +2 -2
  97. package/docs/interfaces/DreamAppInitOptions.html +2 -2
  98. package/docs/interfaces/DreamAppOpts.html +2 -2
  99. package/docs/interfaces/DreamSerializerAssociationStatement.html +2 -2
  100. package/docs/interfaces/EncryptOptions.html +2 -2
  101. package/docs/interfaces/OpenapiSchemaProperties.html +1 -1
  102. package/docs/interfaces/OpenapiSchemaPropertiesShorthand.html +1 -1
  103. package/docs/interfaces/OpenapiTypeFieldObject.html +1 -1
  104. package/docs/types/Camelized.html +1 -1
  105. package/docs/types/CommonOpenapiSchemaObjectFields.html +1 -1
  106. package/docs/types/DateTime.html +1 -1
  107. package/docs/types/DbConnectionType.html +1 -1
  108. package/docs/types/DreamAssociationMetadata.html +1 -1
  109. package/docs/types/DreamAttributes.html +1 -1
  110. package/docs/types/DreamClassColumn.html +1 -1
  111. package/docs/types/DreamColumn.html +1 -1
  112. package/docs/types/DreamColumnNames.html +1 -1
  113. package/docs/types/DreamLogLevel.html +1 -1
  114. package/docs/types/DreamLogger.html +1 -1
  115. package/docs/types/DreamOrViewModelSerializerKey.html +1 -1
  116. package/docs/types/DreamParamSafeAttributes.html +1 -1
  117. package/docs/types/DreamParamSafeColumnNames.html +1 -1
  118. package/docs/types/DreamSerializerKey.html +1 -1
  119. package/docs/types/DreamSerializers.html +1 -1
  120. package/docs/types/DreamTableSchema.html +1 -1
  121. package/docs/types/DreamVirtualColumns.html +1 -1
  122. package/docs/types/EncryptAlgorithm.html +1 -1
  123. package/docs/types/Hyphenized.html +1 -1
  124. package/docs/types/IdType.html +1 -1
  125. package/docs/types/OpenapiAllTypes.html +1 -1
  126. package/docs/types/OpenapiFormats.html +1 -1
  127. package/docs/types/OpenapiNumberFormats.html +1 -1
  128. package/docs/types/OpenapiPrimitiveTypes.html +1 -1
  129. package/docs/types/OpenapiSchemaArray.html +1 -1
  130. package/docs/types/OpenapiSchemaArrayShorthand.html +1 -1
  131. package/docs/types/OpenapiSchemaBase.html +1 -1
  132. package/docs/types/OpenapiSchemaBody.html +1 -1
  133. package/docs/types/OpenapiSchemaBodyShorthand.html +1 -1
  134. package/docs/types/OpenapiSchemaCommonFields.html +1 -1
  135. package/docs/types/OpenapiSchemaExpressionAllOf.html +1 -1
  136. package/docs/types/OpenapiSchemaExpressionAnyOf.html +1 -1
  137. package/docs/types/OpenapiSchemaExpressionOneOf.html +1 -1
  138. package/docs/types/OpenapiSchemaExpressionRef.html +1 -1
  139. package/docs/types/OpenapiSchemaExpressionRefSchemaShorthand.html +1 -1
  140. package/docs/types/OpenapiSchemaInteger.html +1 -1
  141. package/docs/types/OpenapiSchemaNull.html +1 -1
  142. package/docs/types/OpenapiSchemaNumber.html +1 -1
  143. package/docs/types/OpenapiSchemaObject.html +1 -1
  144. package/docs/types/OpenapiSchemaObjectAllOf.html +1 -1
  145. package/docs/types/OpenapiSchemaObjectAllOfShorthand.html +1 -1
  146. package/docs/types/OpenapiSchemaObjectAnyOf.html +1 -1
  147. package/docs/types/OpenapiSchemaObjectAnyOfShorthand.html +1 -1
  148. package/docs/types/OpenapiSchemaObjectBase.html +1 -1
  149. package/docs/types/OpenapiSchemaObjectBaseShorthand.html +1 -1
  150. package/docs/types/OpenapiSchemaObjectOneOf.html +1 -1
  151. package/docs/types/OpenapiSchemaObjectOneOfShorthand.html +1 -1
  152. package/docs/types/OpenapiSchemaObjectShorthand.html +1 -1
  153. package/docs/types/OpenapiSchemaPrimitiveGeneric.html +1 -1
  154. package/docs/types/OpenapiSchemaShorthandExpressionAllOf.html +1 -1
  155. package/docs/types/OpenapiSchemaShorthandExpressionAnyOf.html +1 -1
  156. package/docs/types/OpenapiSchemaShorthandExpressionOneOf.html +1 -1
  157. package/docs/types/OpenapiSchemaShorthandExpressionSerializableRef.html +1 -1
  158. package/docs/types/OpenapiSchemaShorthandExpressionSerializerRef.html +1 -1
  159. package/docs/types/OpenapiSchemaShorthandPrimitiveGeneric.html +1 -1
  160. package/docs/types/OpenapiSchemaString.html +1 -1
  161. package/docs/types/OpenapiShorthandAllTypes.html +1 -1
  162. package/docs/types/OpenapiShorthandPrimitiveTypes.html +1 -1
  163. package/docs/types/OpenapiTypeField.html +1 -1
  164. package/docs/types/Pascalized.html +1 -1
  165. package/docs/types/PrimaryKeyType.html +1 -1
  166. package/docs/types/RoundingPrecision.html +1 -1
  167. package/docs/types/SerializableClassOrSerializerCallback.html +1 -1
  168. package/docs/types/SerializableDreamClassOrViewModelClass.html +1 -1
  169. package/docs/types/SerializableDreamOrViewModel.html +1 -1
  170. package/docs/types/SerializableTypes.html +1 -1
  171. package/docs/types/Snakeified.html +1 -1
  172. package/docs/types/Timestamp.html +1 -1
  173. package/docs/types/UpdateableAssociationProperties.html +1 -1
  174. package/docs/types/UpdateableProperties.html +1 -1
  175. package/docs/types/ValidationType.html +1 -1
  176. package/docs/types/ViewModelSerializerKey.html +1 -1
  177. package/docs/types/WhereStatementForDream.html +1 -1
  178. package/docs/types/WhereStatementForDreamClass.html +1 -1
  179. package/docs/variables/DateTime-1.html +1 -1
  180. package/docs/variables/DreamConst.html +1 -1
  181. package/docs/variables/TRIGRAM_OPERATORS.html +1 -1
  182. package/docs/variables/openapiPrimitiveTypes-1.html +1 -1
  183. package/docs/variables/openapiShorthandPrimitiveTypes-1.html +1 -1
  184. package/docs/variables/ops.html +1 -1
  185. package/docs/variables/primaryKeyTypes.html +1 -1
  186. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  export default class LoadBuilder {
2
- dream;
3
2
  dreamTransaction;
3
+ dream;
4
4
  query;
5
5
  /**
6
6
  * An intermediate class on the way to executing a load
@@ -12,7 +12,8 @@ export default class LoadBuilder {
12
12
  * await user.load('settings').execute()
13
13
  * ```
14
14
  */
15
- constructor(dream, txn) {
15
+ constructor(dream, dreamTransaction) {
16
+ this.dreamTransaction = dreamTransaction;
16
17
  this.dream = dream['clone']();
17
18
  // Load queries start from the table corresponding to an instance
18
19
  // of a Dream. However, the Dream may have default scopes that would
@@ -21,7 +22,6 @@ export default class LoadBuilder {
21
22
  // to other associations (thus the use of `removeAllDefaultScopesExceptOnAssociations`
22
23
  // instead of `removeAllDefaultScopes`).
23
24
  this.query = this.dream.query()['removeAllDefaultScopesExceptOnAssociations']();
24
- this.dreamTransaction = txn;
25
25
  }
26
26
  passthrough(passthroughWhereStatement) {
27
27
  this.query = this.query.passthrough(passthroughWhereStatement);
@@ -30,12 +30,7 @@ export default async function createAssociation(dream, txn = null, associationNa
30
30
  if (hasAssociation.polymorphic) {
31
31
  modifiedOpts[hasAssociation.foreignKeyTypeField()] = dream['stiBaseClassOrOwnClassName'];
32
32
  }
33
- if (txn) {
34
- hasresult = await associationClass.txn(txn).create(modifiedOpts);
35
- }
36
- else {
37
- hasresult = await associationClass.create(modifiedOpts);
38
- }
33
+ hasresult = await associationClass.txn(txn).create(modifiedOpts);
39
34
  return hasresult;
40
35
  case 'BelongsTo':
41
36
  belongstoFn = async (txn) => {
@@ -37,7 +37,7 @@ async function destroyDreamWithTransaction(dream, txn, options) {
37
37
  }
38
38
  await maybeDestroyDream(dream, txn, reallyDestroy);
39
39
  if (!skipHooks) {
40
- await runHooksFor('afterDestroy', dream, true, null, txn || undefined);
40
+ await runHooksFor('afterDestroy', dream, true, null, txn);
41
41
  await runHooksFor('afterDestroyCommit', dream, true, null, txn);
42
42
  }
43
43
  if (shouldSoftDelete(dream, reallyDestroy)) {
@@ -0,0 +1,13 @@
1
+ export default async function findOrCreateBy(dreamClass, txn = null, attributes, extraOpts = {}) {
2
+ const existingRecord = await dreamClass
3
+ .txn(txn)
4
+ .findBy(dreamClass['extractAttributesFromUpdateableProperties'](attributes));
5
+ if (existingRecord)
6
+ return existingRecord;
7
+ const dreamModel = dreamClass.new({
8
+ ...attributes,
9
+ ...(extraOpts?.createWith || {}),
10
+ });
11
+ await dreamModel.txn(txn).save();
12
+ return dreamModel;
13
+ }
@@ -35,7 +35,7 @@ export default async function runHooksFor(key, dream, alreadyPersisted, beforeSa
35
35
  if (txn)
36
36
  txn.addCommitHook(hook, dream);
37
37
  else
38
- await runHook(hook, dream);
38
+ await runHook(hook, dream, null);
39
39
  }
40
40
  break;
41
41
  case 'afterSave':
@@ -50,7 +50,7 @@ export default async function runHooksFor(key, dream, alreadyPersisted, beforeSa
50
50
  if (txn)
51
51
  txn.addCommitHook(hook, dream);
52
52
  else
53
- await runHook(hook, dream);
53
+ await runHook(hook, dream, null);
54
54
  }
55
55
  break;
56
56
  case 'afterUpdate':
@@ -63,7 +63,7 @@ export default async function runHooksFor(key, dream, alreadyPersisted, beforeSa
63
63
  if (txn)
64
64
  txn.addCommitHook(hook, dream);
65
65
  else
66
- await runHook(hook, dream);
66
+ await runHook(hook, dream, null);
67
67
  }
68
68
  break;
69
69
  default:
@@ -79,7 +79,7 @@ export default async function runHooksFor(key, dream, alreadyPersisted, beforeSa
79
79
  if (txn)
80
80
  txn.addCommitHook(hook, dream);
81
81
  else
82
- await runHook(hook, dream);
82
+ await runHook(hook, dream, null);
83
83
  break;
84
84
  default:
85
85
  await runHook(hook, dream, txn);
@@ -6,7 +6,7 @@ import sqlAttributes from '../../helpers/sqlAttributes.js';
6
6
  import executeDatabaseQuery from './executeDatabaseQuery.js';
7
7
  import runHooksFor from './runHooksFor.js';
8
8
  export default async function saveDream(dream, txn = null, { skipHooks = false } = {}) {
9
- const db = txn?.kyselyTransaction || _db('primary');
9
+ const db = txn?.kyselyTransaction ?? _db('primary');
10
10
  const alreadyPersisted = dream.isPersisted;
11
11
  if (!skipHooks) {
12
12
  if (alreadyPersisted)
@@ -0,0 +1,15 @@
1
+ import saveDream from './saveDream.js';
2
+ export default async function updateOrCreateBy(dreamClass, txn = null, attributes, extraOpts = {}) {
3
+ const existingRecord = await dreamClass
4
+ .txn(txn)
5
+ .findBy(dreamClass['extractAttributesFromUpdateableProperties'](attributes));
6
+ const { with: attrs, skipHooks } = extraOpts;
7
+ if (existingRecord) {
8
+ existingRecord.assignAttributes(attrs ?? {});
9
+ return await saveDream(existingRecord, txn, skipHooks ? { skipHooks } : undefined);
10
+ }
11
+ return await dreamClass.txn(txn).create({
12
+ ...attributes,
13
+ ...(extraOpts?.with || {}),
14
+ }, skipHooks ? { skipHooks } : undefined);
15
+ }
@@ -0,0 +1,15 @@
1
+ export default class CreateOrUpdateByFailedToCreateAndUpdate extends Error {
2
+ dreamClass;
3
+ constructor(dreamClass) {
4
+ super();
5
+ this.dreamClass = dreamClass;
6
+ }
7
+ get message() {
8
+ return `
9
+ Failed to create instance of ${this.dreamClass.sanitizedName} and no matching model exists to update.
10
+
11
+ The likely cause is that one of the \`with\` fields violates
12
+ a uniqueness constraint.
13
+ `;
14
+ }
15
+ }
@@ -11,7 +11,7 @@ import LoadBuilder from './dream/LoadBuilder.js';
11
11
  import Query from './dream/Query.js';
12
12
  import { AssociationStatementsMap, PassthroughOnClause, WhereStatement } from './types/associations/shared.js';
13
13
  import { AssociationTableNames, DbConnectionType } from './types/db.js';
14
- import { AllDefaultScopeNames, AssociationNameToDream, AttributeKeys, DefaultOrNamedScopeName, DreamAssociationNames, DreamAssociationNamesWithoutRequiredOnClauses, DreamAttributes, DreamColumnNames, DreamParamSafeColumnNames, DreamSerializeOptions, IdType, JoinAndStatements, NextPreloadArgumentType, OrderDir, PassthroughColumnNames, PluckEachArgs, PrimaryKeyForFind, TableColumnNames, UpdateableAssociationProperties, UpdateableProperties, UpdateablePropertiesForClass } from './types/dream.js';
14
+ import { AllDefaultScopeNames, AssociationNameToDream, AttributeKeys, CreateOrFindByExtraOpts, DefaultOrNamedScopeName, DreamAssociationNames, DreamAssociationNamesWithoutRequiredOnClauses, DreamAttributes, DreamColumnNames, DreamParamSafeColumnNames, DreamSerializeOptions, IdType, JoinAndStatements, NextPreloadArgumentType, OrderDir, PassthroughColumnNames, PluckEachArgs, PrimaryKeyForFind, TableColumnNames, UpdateableAssociationProperties, UpdateableProperties, UpdateablePropertiesForClass, UpdateOrCreateByExtraOpts } from './types/dream.js';
15
15
  import { HookStatement, HookStatementMap } from './types/lifecycle.js';
16
16
  import { BaseModelColumnTypes, DefaultQueryTypeOptions, FindEachOpts, QueryWithJoinedAssociationsType, QueryWithJoinedAssociationsTypeAndNoPreload } from './types/query.js';
17
17
  import { ValidationStatement, ValidationType } from './types/validation.js';
@@ -487,9 +487,12 @@ export default class Dream {
487
487
  * ```
488
488
  *
489
489
  * @param attributes - attributes or belongs to associations you wish to set on this model before persisting
490
+ * @param opts.skipHooks - if true, will skip applying model hooks. Defaults to false
490
491
  * @returns A newly persisted dream instance
491
492
  */
492
- static create<T extends typeof Dream>(this: T, attributes?: UpdateablePropertiesForClass<T>): Promise<InstanceType<T>>;
493
+ static create<T extends typeof Dream>(this: T, attributes?: UpdateablePropertiesForClass<T>, { skipHooks }?: {
494
+ skipHooks?: boolean;
495
+ }): Promise<InstanceType<T>>;
493
496
  /**
494
497
  * Attempt to create the model. If creation fails
495
498
  * due to uniqueness constraint, then find the existing
@@ -509,7 +512,40 @@ export default class Dream {
509
512
  * @param extraOpts.createWith - additional attributes to persist when creating, but not used for finding
510
513
  * @returns A dream instance
511
514
  */
512
- static createOrFindBy<T extends typeof Dream>(this: T, attributes: UpdateablePropertiesForClass<T>, extraOpts?: CreateOrFindByExtraOps<T>): Promise<InstanceType<T>>;
515
+ static createOrFindBy<T extends typeof Dream>(this: T, attributes: UpdateablePropertiesForClass<T>, extraOpts?: CreateOrFindByExtraOpts<T>): Promise<InstanceType<T>>;
516
+ /**
517
+ * Attempt to update the model with the given attributes.
518
+ * If no record is found, then a new record is created.
519
+ * All lifecycle hooks are run for whichever action is taken.
520
+ *
521
+ * ```ts
522
+ * const user = await User.updateOrCreateBy({ email }, { with: { name: 'Alice' })
523
+ * ```
524
+ *
525
+ * @param attributes - The base attributes for finding which record to update, also used when creating
526
+ * @param extraOpts.with - additional attributes to persist when updating and creating, but not used for finding
527
+ * @param extraOpts.skipHooks - if true, will skip applying model hooks. Defaults to false
528
+ * @returns A dream instance
529
+ */
530
+ static updateOrCreateBy<T extends typeof Dream>(this: T, attributes: UpdateablePropertiesForClass<T>, extraOpts?: UpdateOrCreateByExtraOpts<T>): Promise<InstanceType<T>>;
531
+ /**
532
+ * Attempt to create the model with the given attributes.
533
+ * If creation fails due to uniqueness constraint, then find and update
534
+ * the existing model. All lifecycle hooks are run for whichever
535
+ * action is taken.
536
+ *
537
+ * This is useful in situations where we want to avoid
538
+ * a race condition creating duplicate records.
539
+ *
540
+ * IMPORTANT: A unique index/uniqueness constraint must exist on
541
+ * at least one of the provided attributes
542
+ *
543
+ * @param attributes - The base attributes for finding which record to update, also used when creating
544
+ * @param extraOpts.with - additional attributes to persist when updating and creating, but not used for finding
545
+ * @param extraOpts.skipHooks - if true, will skip applying model hooks. Defaults to false
546
+ * @returns A dream instance
547
+ */
548
+ static createOrUpdateBy<T extends typeof Dream>(this: T, attributes: UpdateablePropertiesForClass<T>, extraOpts?: UpdateOrCreateByExtraOpts<T>): Promise<InstanceType<T>>;
513
549
  /**
514
550
  * Returns a new query instance with the distinct query applied.
515
551
  * If no columnName is provided, then distinct will apply to the
@@ -649,7 +685,7 @@ export default class Dream {
649
685
  * @param extraOpts.createWith - additional attributes to persist when creating, but not used for finding
650
686
  * @returns A dream instance
651
687
  */
652
- static findOrCreateBy<T extends typeof Dream>(this: T, attributes: UpdateablePropertiesForClass<T>, extraOpts?: CreateOrFindByExtraOps<T>): Promise<InstanceType<T>>;
688
+ static findOrCreateBy<T extends typeof Dream>(this: T, attributes: UpdateablePropertiesForClass<T>, extraOpts?: CreateOrFindByExtraOpts<T>): Promise<InstanceType<T>>;
653
689
  /**
654
690
  * Returns true if a record exists for the given
655
691
  * model class
@@ -1029,7 +1065,7 @@ export default class Dream {
1029
1065
  * @param txn - A DreamTransaction instance (usually collected by calling `ApplicationModel.transaction`)
1030
1066
  * @returns A Query scoped to this model with the transaction applied
1031
1067
  */
1032
- static txn<T extends typeof Dream, I extends InstanceType<T>>(this: T, txn: DreamTransaction<I>): DreamClassTransactionBuilder<I>;
1068
+ static txn<T extends typeof Dream, I extends InstanceType<T>>(this: T, txn: DreamTransaction<I> | null): DreamClassTransactionBuilder<T, I>;
1033
1069
  /**
1034
1070
  * Builds a new DreamTransaction instance, provides
1035
1071
  * the instance to the provided callback.
@@ -2164,7 +2200,7 @@ export default class Dream {
2164
2200
  * @param txn - A DreamTransaction instance (collected by calling `ApplicationModel.transaction`)
2165
2201
  * @returns A Query scoped to this model with the transaction applied
2166
2202
  */
2167
- txn<I extends Dream>(this: I, txn: DreamTransaction<Dream>): DreamInstanceTransactionBuilder<I>;
2203
+ txn<I extends Dream>(this: I, txn: DreamTransaction<Dream> | null): DreamInstanceTransactionBuilder<I>;
2168
2204
  /**
2169
2205
  * Applies all attribute changes passed to the Dream
2170
2206
  * instance, leveraging any custom-defined setters,
@@ -2260,6 +2296,3 @@ export default class Dream {
2260
2296
  unpreventDeletion(): this;
2261
2297
  private _preventDeletion;
2262
2298
  }
2263
- export interface CreateOrFindByExtraOps<T extends typeof Dream> {
2264
- createWith?: WhereStatement<InstanceType<T>['DB'], InstanceType<T>['schema'], InstanceType<T>['table']> | UpdateablePropertiesForClass<T>;
2265
- }
@@ -1,22 +1,23 @@
1
- import { SelectArg, SelectExpression, Updateable } from 'kysely';
1
+ import { SelectArg, SelectExpression } from 'kysely';
2
2
  import Dream from '../Dream.js';
3
3
  import { PassthroughOnClause, WhereStatement } from '../types/associations/shared.js';
4
4
  import { AssociationTableNames } from '../types/db.js';
5
- import { DefaultScopeName, DreamColumnNames, OrderDir, PassthroughColumnNames, PluckEachArgs, PrimaryKeyForFind, TableColumnNames, UpdateableProperties } from '../types/dream.js';
5
+ import { CreateOrFindByExtraOpts, DefaultScopeName, DreamColumnNames, OrderDir, PassthroughColumnNames, PluckEachArgs, PrimaryKeyForFind, TableColumnNames, UpdateableProperties, UpdateablePropertiesForClass, UpdateOrCreateByExtraOpts } from '../types/dream.js';
6
6
  import { BaseModelColumnTypes, FindEachOpts, QueryWithJoinedAssociationsType, QueryWithJoinedAssociationsTypeAndNoPreload } from '../types/query.js';
7
7
  import { JoinedAssociation, JoinedAssociationsTypeFromAssociations, VariadicJoinsArgs, VariadicLeftJoinLoadArgs, VariadicLoadArgs } from '../types/variadic.js';
8
8
  import DreamTransaction from './DreamTransaction.js';
9
9
  import Query from './Query.js';
10
- export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
10
+ export default class DreamClassTransactionBuilder<DreamClass extends typeof Dream, DreamInstance extends Dream> {
11
+ private dreamClass;
12
+ private dreamTransaction;
11
13
  dreamInstance: DreamInstance;
12
- dreamTransaction: DreamTransaction<Dream>;
13
14
  /**
14
15
  * Constructs a new DreamClassTransactionBuilder.
15
16
  *
16
17
  * @param dreamInstance - The Dream instance to build the transaction for
17
18
  * @param txn - The DreamTransaction instance
18
19
  */
19
- constructor(dreamInstance: DreamInstance, dreamTransaction: DreamTransaction<Dream>);
20
+ constructor(dreamClass: DreamClass, dreamTransaction: DreamTransaction<Dream> | null);
20
21
  /**
21
22
  * Retrieves an array containing all records corresponding to
22
23
  * this model. Be careful using this, since it will attempt to
@@ -33,7 +34,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
33
34
  * @param options.columns - Columns to select
34
35
  * @returns An array of dreams
35
36
  */
36
- all<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, options?: {
37
+ all<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, options?: {
37
38
  columns?: DreamColumnNames<DreamInstance>[];
38
39
  }): Promise<DreamInstance[]>;
39
40
  /**
@@ -42,7 +43,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
42
43
  *
43
44
  * @returns The number of records corresponding to this model
44
45
  */
45
- count<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Promise<number>;
46
+ count<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Promise<number>;
46
47
  /**
47
48
  * Returns a new Query instance, specifying a limit
48
49
  *
@@ -56,7 +57,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
56
57
  * @param limit - The number of records to limit the query to
57
58
  * @returns A Query for this model with the limit clause applied
58
59
  */
59
- limit<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, limit: number | null): Query<DreamInstance>;
60
+ limit<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, limit: number | null): Query<DreamInstance>;
60
61
  /**
61
62
  * Returns a new Query instance, specifying an offset
62
63
  *
@@ -70,7 +71,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
70
71
  * @param offset - The number of records to offset the query by
71
72
  * @returns A Query for this model with the offset clause applied
72
73
  */
73
- offset<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, offset: number | null): Query<DreamInstance>;
74
+ offset<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, offset: number | null): Query<DreamInstance>;
74
75
  /**
75
76
  * Retrieves the max value of the specified column
76
77
  * for this model's records.
@@ -85,7 +86,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
85
86
  * @param columnName - A column name on the model
86
87
  * @returns The max value of the specified column for this model's records
87
88
  */
88
- max<I extends DreamClassTransactionBuilder<DreamInstance>, T extends DreamColumnNames<DreamInstance>>(this: I, columnName: T): Promise<DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]["coercedType" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]]>;
89
+ max<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, T extends DreamColumnNames<DreamInstance>>(this: I, columnName: T): Promise<DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]["coercedType" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]]>;
89
90
  /**
90
91
  * Retrieves the min value of the specified column
91
92
  * for this model's records.
@@ -100,7 +101,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
100
101
  * @param columnName - A column name on the model
101
102
  * @returns The min value of the specified column for this model's records
102
103
  */
103
- min<I extends DreamClassTransactionBuilder<DreamInstance>, T extends DreamColumnNames<DreamInstance>>(this: I, columnName: T): Promise<DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]["coercedType" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]]>;
104
+ min<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, T extends DreamColumnNames<DreamInstance>>(this: I, columnName: T): Promise<DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]["coercedType" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]][T & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]["columns" & keyof DreamInstance["schema"][DreamInstance["table"] & keyof DreamInstance["schema"]]]]]>;
104
105
  /**
105
106
  * Persists a new record, setting the provided attributes
106
107
  *
@@ -114,7 +115,9 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
114
115
  * @param attributes - Attributes or belongs to associations you wish to set on this model before persisting
115
116
  * @returns A newly persisted dream instance
116
117
  */
117
- create<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, attributes?: UpdateableProperties<DreamInstance>): Promise<DreamInstance>;
118
+ create<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, attributes?: UpdateableProperties<DreamInstance>, { skipHooks }?: {
119
+ skipHooks?: boolean;
120
+ }): Promise<DreamInstance>;
118
121
  /**
119
122
  * Finds a record for the corresponding model with the
120
123
  * specified primary key. If not found, null is returned.
@@ -129,7 +132,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
129
132
  * @param primaryKey - The primary key of the record to look up
130
133
  * @returns Either the found record, or else null
131
134
  */
132
- find<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, primaryKey: PrimaryKeyForFind<DreamInstance>): Promise<DreamInstance | null>;
135
+ find<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, primaryKey: PrimaryKeyForFind<DreamInstance>): Promise<DreamInstance | null>;
133
136
  /**
134
137
  * Finds a record for the corresponding model with the
135
138
  * specified primary key. If not found, an exception is raised.
@@ -144,7 +147,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
144
147
  * @param primaryKey - The primary key of the record to look up
145
148
  * @returns The found record
146
149
  */
147
- findOrFail<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, primaryKey: PrimaryKeyForFind<DreamInstance>): Promise<DreamInstance>;
150
+ findOrFail<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, primaryKey: PrimaryKeyForFind<DreamInstance>): Promise<DreamInstance>;
148
151
  /**
149
152
  * Finds the first record—ordered by primary key—matching
150
153
  * the corresponding model and the specified where statement.
@@ -160,7 +163,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
160
163
  * @param attributes - The where statement used to locate the record
161
164
  * @returns Either the first model found matching the whereStatement, or else null
162
165
  */
163
- findBy<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB']>(this: I, attributes: Updateable<DB[DreamInstance['table']]>): Promise<DreamInstance | null>;
166
+ findBy<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, attributes: WhereStatement<DreamInstance['DB'], DreamInstance['schema'], DreamInstance['table']>): Promise<DreamInstance | null>;
164
167
  /**
165
168
  * Finds the first record—ordered by primary key—matching
166
169
  * the corresponding model and the specified where statement.
@@ -176,7 +179,39 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
176
179
  * @param whereStatement - The where statement used to locate the record
177
180
  * @returns The first model found matching the whereStatement
178
181
  */
179
- findOrFailBy<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, whereStatement: WhereStatement<DreamInstance['DB'], DreamInstance['schema'], DreamInstance['table']>): Promise<DreamInstance>;
182
+ findOrFailBy<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, whereStatement: WhereStatement<DreamInstance['DB'], DreamInstance['schema'], DreamInstance['table']>): Promise<DreamInstance>;
183
+ /**
184
+ * Attempt to find the model with the given attributes.
185
+ * If no record is found, then a new record is created.
186
+ *
187
+ * ```ts
188
+ * await ApplicationModel.transaction(async txn => {
189
+ * await User.txn(txn).findOrCreateBy({ email }, { createWith: params })
190
+ * })
191
+ * ```
192
+ *
193
+ * @param attributes - The base attributes for finding, but also the attributes to use when creating
194
+ * @param extraOpts.createWith - additional attributes to persist when creating, but not used for finding
195
+ * @returns A dream instance
196
+ */
197
+ findOrCreateBy<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, attributes: UpdateablePropertiesForClass<DreamClass>, extraOpts?: CreateOrFindByExtraOpts<DreamClass>): Promise<InstanceType<DreamClass>>;
198
+ /**
199
+ * Attempt to update the model with the given attributes.
200
+ * If no record is found, then a new record is created.
201
+ * All lifecycle hooks are run for whichever action is taken.
202
+ *
203
+ * ```ts
204
+ * await ApplicationModel.transaction(async txn => {
205
+ * await User.txn(txn).updateOrCreateBy({ email }, { with: { name: 'Alice' })
206
+ * })
207
+ * ```
208
+ *
209
+ * @param attributes - The base attributes for finding, but also the attributes to use when creating
210
+ * @param extraOpts.with - additional attributes to persist when updating and creating, but not used for finding
211
+ * @param extraOpts.skipHooks - if true, will skip applying model hooks. Defaults to false
212
+ * @returns A dream instance
213
+ */
214
+ updateOrCreateBy<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, attributes: UpdateablePropertiesForClass<DreamClass>, extraOpts?: UpdateOrCreateByExtraOpts<DreamClass>): Promise<InstanceType<DreamClass>>;
180
215
  /**
181
216
  * Finds all records for the corresponding model in batches,
182
217
  * and then calls the provided callback for each found record.
@@ -198,7 +233,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
198
233
  * @param options.batchSize - The batch size you wish to collect records in. If not provided, it will default to 1000
199
234
  * @returns void
200
235
  */
201
- findEach<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, cb: (instance: DreamInstance) => void | Promise<void>, options?: FindEachOpts): Promise<void>;
236
+ findEach<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, cb: (instance: DreamInstance) => void | Promise<void>, options?: FindEachOpts): Promise<void>;
202
237
  /**
203
238
  * Returns the first record corresponding to the
204
239
  * model, ordered by primary key.
@@ -212,7 +247,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
212
247
  *
213
248
  * @returns First record, or null if no record exists
214
249
  */
215
- first<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Promise<DreamInstance | null>;
250
+ first<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Promise<DreamInstance | null>;
216
251
  /**
217
252
  * Returns the first record corresponding to the
218
253
  * model, ordered by primary key. If no record
@@ -227,7 +262,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
227
262
  *
228
263
  * @returns First record
229
264
  */
230
- firstOrFail<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Promise<DreamInstance>;
265
+ firstOrFail<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Promise<DreamInstance>;
231
266
  /**
232
267
  * Returns true if a record exists for the given
233
268
  * model class.
@@ -246,7 +281,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
246
281
  *
247
282
  * @returns boolean
248
283
  */
249
- exists<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Promise<boolean>;
284
+ exists<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Promise<boolean>;
250
285
  /**
251
286
  * Load each specified association using a single SQL query.
252
287
  * See {@link #preload} for preloading in separate queries.
@@ -268,7 +303,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
268
303
  * @param args - A chain of association names and where clauses
269
304
  * @returns A query for this model with the include statement applied
270
305
  */
271
- leftJoinPreload<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[], const LastArg extends VariadicLeftJoinLoadArgs<DB, Schema, TableName, Arr>, const JoinedAssociationsCandidate = JoinedAssociationsTypeFromAssociations<DB, Schema, TableName, [
306
+ leftJoinPreload<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[], const LastArg extends VariadicLeftJoinLoadArgs<DB, Schema, TableName, Arr>, const JoinedAssociationsCandidate = JoinedAssociationsTypeFromAssociations<DB, Schema, TableName, [
272
307
  ...Arr,
273
308
  LastArg
274
309
  ]>, const JoinedAssociations extends readonly JoinedAssociation[] = JoinedAssociationsCandidate extends readonly JoinedAssociation[] ? JoinedAssociationsCandidate : never, RetQuery = QueryWithJoinedAssociationsTypeAndNoPreload<Query<DreamInstance>, JoinedAssociations>>(this: I, ...args: [...Arr, LastArg]): RetQuery;
@@ -293,7 +328,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
293
328
  * @param args - A chain of association names and where clauses
294
329
  * @returns A query for this model with the preload statement applied
295
330
  */
296
- preload<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[]>(this: I, ...args: [...Arr, VariadicLoadArgs<DB, Schema, TableName, Arr>]): Query<DreamInstance, Readonly<{
331
+ preload<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[]>(this: I, ...args: [...Arr, VariadicLoadArgs<DB, Schema, TableName, Arr>]): Query<DreamInstance, Readonly<{
297
332
  joinedAssociations: readonly [];
298
333
  rootTableName: DreamInstance["table"];
299
334
  rootTableAlias: DreamInstance extends Dream ? DreamInstance["table"] : DreamInstance;
@@ -313,7 +348,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
313
348
  * @param args - A chain of association names and where clauses
314
349
  * @returns A Query for this model with the inner join clause applied
315
350
  */
316
- innerJoin<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[], const LastArg extends VariadicJoinsArgs<DB, Schema, TableName, Arr>, const JoinedAssociationsCandidate = JoinedAssociationsTypeFromAssociations<DB, Schema, TableName, [
351
+ innerJoin<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[], const LastArg extends VariadicJoinsArgs<DB, Schema, TableName, Arr>, const JoinedAssociationsCandidate = JoinedAssociationsTypeFromAssociations<DB, Schema, TableName, [
317
352
  ...Arr,
318
353
  LastArg
319
354
  ]>, const JoinedAssociations extends readonly JoinedAssociation[] = JoinedAssociationsCandidate extends readonly JoinedAssociation[] ? JoinedAssociationsCandidate : never, RetQuery = QueryWithJoinedAssociationsType<Query<DreamInstance>, JoinedAssociations>>(this: I, ...args: [...Arr, LastArg]): RetQuery;
@@ -330,7 +365,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
330
365
  * @param args - A chain of association names and where clauses
331
366
  * @returns A Query for this model with the left join clause applied
332
367
  */
333
- leftJoin<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[], const LastArg extends VariadicJoinsArgs<DB, Schema, TableName, Arr>, const JoinedAssociationsCandidate = JoinedAssociationsTypeFromAssociations<DB, Schema, TableName, [
368
+ leftJoin<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], TableName extends DreamInstance['table'], Schema extends DreamInstance['schema'], const Arr extends readonly unknown[], const LastArg extends VariadicJoinsArgs<DB, Schema, TableName, Arr>, const JoinedAssociationsCandidate = JoinedAssociationsTypeFromAssociations<DB, Schema, TableName, [
334
369
  ...Arr,
335
370
  LastArg
336
371
  ]>, const JoinedAssociations extends readonly JoinedAssociation[] = JoinedAssociationsCandidate extends readonly JoinedAssociation[] ? JoinedAssociationsCandidate : never, RetQuery = QueryWithJoinedAssociationsType<Query<DreamInstance>, JoinedAssociations>>(this: I, ...args: [...Arr, LastArg]): RetQuery;
@@ -346,20 +381,20 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
346
381
  *
347
382
  * @returns A new Query instance
348
383
  */
349
- queryInstance<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Query<DreamInstance>;
384
+ queryInstance<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Query<DreamInstance>;
350
385
  /**
351
386
  * Returns a query for this model which disregards default scopes
352
387
  *
353
388
  * @returns A query for this model which disregards default scopes
354
389
  */
355
- removeAllDefaultScopes<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Query<DreamInstance>;
390
+ removeAllDefaultScopes<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Query<DreamInstance>;
356
391
  /**
357
392
  * Prevents a specific default scope from applying when
358
393
  * the Query is executed
359
394
  *
360
395
  * @returns A new Query which will prevent a specific default scope from applying
361
396
  */
362
- removeDefaultScope<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, scopeName: DefaultScopeName<DreamInstance>): Query<DreamInstance>;
397
+ removeDefaultScope<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, scopeName: DefaultScopeName<DreamInstance>): Query<DreamInstance>;
363
398
  /**
364
399
  * Returns the last record corresponding to the
365
400
  * model, ordered by primary key.
@@ -373,7 +408,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
373
408
  *
374
409
  * @returns Last record, or null if no record exists
375
410
  */
376
- last<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Promise<DreamInstance | null>;
411
+ last<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Promise<DreamInstance | null>;
377
412
  /**
378
413
  * Returns the last record corresponding to the
379
414
  * model, ordered by primary key. If no record
@@ -388,7 +423,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
388
423
  *
389
424
  * @returns Last record
390
425
  */
391
- lastOrFail<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I): Promise<DreamInstance>;
426
+ lastOrFail<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I): Promise<DreamInstance>;
392
427
  /**
393
428
  * Returns a new Kysely SelectQueryBuilder instance to be used
394
429
  * in a sub Query
@@ -405,7 +440,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
405
440
  * @param selection - the column to use for your nested Query
406
441
  * @returns A Kysely SelectQueryBuilder instance
407
442
  */
408
- nestedSelect<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], SE extends SelectExpression<DB, DreamInstance['table']>>(this: I, selection: SelectArg<DB, DreamInstance['table'], SE>): import("kysely").SelectQueryBuilder<any, any, any>;
443
+ nestedSelect<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], SE extends SelectExpression<DB, DreamInstance['table']>>(this: I, selection: SelectArg<DB, DreamInstance['table'], SE>): import("kysely").SelectQueryBuilder<any, any, any>;
409
444
  /**
410
445
  * Returns a new Query instance, attaching the provided
411
446
  * order statement
@@ -427,7 +462,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
427
462
  * @param orderStatement - Either a string or an object specifying order. If a string, the order is implicitly ascending. If the orderStatement is an object, statements will be provided in the order of the keys set in the object
428
463
  * @returns A query for this model with the order clause applied
429
464
  */
430
- order<I extends DreamClassTransactionBuilder<DreamInstance>>(this: I, arg: DreamColumnNames<DreamInstance> | Partial<Record<DreamColumnNames<DreamInstance>, OrderDir>> | null): Query<DreamInstance, Readonly<{
465
+ order<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>>(this: I, arg: DreamColumnNames<DreamInstance> | Partial<Record<DreamColumnNames<DreamInstance>, OrderDir>> | null): Query<DreamInstance, Readonly<{
431
466
  joinedAssociations: Readonly<[]>;
432
467
  rootTableName: DreamInstance["table"];
433
468
  rootTableAlias: DreamInstance extends Dream ? DreamInstance["table"] : DreamInstance;
@@ -457,7 +492,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
457
492
  * @param columnNames - The column or array of columns to pluck
458
493
  * @returns An array of pluck results
459
494
  */
460
- pluck<I extends DreamClassTransactionBuilder<DreamInstance>, ColumnNames extends TableColumnNames<DreamInstance['DB'], DreamInstance['table']>[], ReturnValue extends ColumnNames['length'] extends 1 ? BaseModelColumnTypes<ColumnNames, DreamInstance>[0][] : BaseModelColumnTypes<ColumnNames, DreamInstance>[]>(this: I, ...columnNames: ColumnNames): Promise<ReturnValue>;
495
+ pluck<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, ColumnNames extends TableColumnNames<DreamInstance['DB'], DreamInstance['table']>[], ReturnValue extends ColumnNames['length'] extends 1 ? BaseModelColumnTypes<ColumnNames, DreamInstance>[0][] : BaseModelColumnTypes<ColumnNames, DreamInstance>[]>(this: I, ...columnNames: ColumnNames): Promise<ReturnValue>;
461
496
  /**
462
497
  * Plucks the specified fields from the given dream class table
463
498
  * in batches, passing each found columns into the provided callback function.
@@ -476,7 +511,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
476
511
  * @param fields - A list of fields to pluck, followed by a callback function to call for each set of found fields
477
512
  * @returns void
478
513
  */
479
- pluckEach<I extends DreamClassTransactionBuilder<DreamInstance>, ColumnName extends keyof UpdateableProperties<DreamInstance>, ColumnNames extends ColumnName[], CbArgTypes extends BaseModelColumnTypes<ColumnNames, DreamInstance>>(this: I, ...args: PluckEachArgs<ColumnNames, CbArgTypes>): Promise<void>;
514
+ pluckEach<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, ColumnName extends keyof UpdateableProperties<DreamInstance>, ColumnNames extends ColumnName[], CbArgTypes extends BaseModelColumnTypes<ColumnNames, DreamInstance>>(this: I, ...args: PluckEachArgs<ColumnNames, CbArgTypes>): Promise<void>;
480
515
  /**
481
516
  * Sends data through for use as passthrough data
482
517
  * for the associations that require it.
@@ -502,7 +537,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
502
537
  * @param passthroughWhereStatement - Where statement used for associations that require passthrough data
503
538
  * @returns A Query for this model with the passthrough data
504
539
  */
505
- passthrough<I extends DreamClassTransactionBuilder<DreamInstance>, PassthroughColumns extends PassthroughColumnNames<DreamInstance>>(this: I, passthroughWhereStatement: PassthroughOnClause<PassthroughColumns>): Query<DreamInstance>;
540
+ passthrough<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, PassthroughColumns extends PassthroughColumnNames<DreamInstance>>(this: I, passthroughWhereStatement: PassthroughOnClause<PassthroughColumns>): Query<DreamInstance>;
506
541
  /**
507
542
  * Applies a where statement to a new Query instance
508
543
  * scoped to this model.
@@ -517,7 +552,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
517
552
  * @param whereStatement - Where statement to apply to the Query
518
553
  * @returns A Query for this model with the where clause applied
519
554
  */
520
- where<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], Schema extends DreamInstance['schema'], TableName extends AssociationTableNames<DB, Schema> & keyof DB = I['dreamInstance']['table'] & keyof DB>(this: I, whereStatement: WhereStatement<DB, Schema, TableName>): Query<DreamInstance>;
555
+ where<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], Schema extends DreamInstance['schema'], TableName extends AssociationTableNames<DB, Schema> & keyof DB = I['dreamInstance']['table'] & keyof DB>(this: I, whereStatement: WhereStatement<DB, Schema, TableName>): Query<DreamInstance>;
521
556
  /**
522
557
  * Applies "OR"'d where statements to a Query scoped
523
558
  * to this model.
@@ -532,7 +567,7 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
532
567
  * @param whereStatements - An array of where statements to `OR` together
533
568
  * @returns A Query for this model with the whereAny clause applied
534
569
  */
535
- whereAny<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], Schema extends DreamInstance['schema'], TableName extends AssociationTableNames<DB, Schema> & keyof DB = I['dreamInstance']['table'] & keyof DB>(this: I, whereStatements: WhereStatement<DB, Schema, TableName>[]): Query<DreamInstance>;
570
+ whereAny<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], Schema extends DreamInstance['schema'], TableName extends AssociationTableNames<DB, Schema> & keyof DB = I['dreamInstance']['table'] & keyof DB>(this: I, whereStatements: WhereStatement<DB, Schema, TableName>[]): Query<DreamInstance>;
536
571
  /**
537
572
  * Applies a whereNot statement to a new Query instance
538
573
  * scoped to this model.
@@ -547,5 +582,5 @@ export default class DreamClassTransactionBuilder<DreamInstance extends Dream> {
547
582
  * @param whereStatement - A where statement to negate and apply to the Query
548
583
  * @returns A Query for this model with the whereNot clause applied
549
584
  */
550
- whereNot<I extends DreamClassTransactionBuilder<DreamInstance>, DB extends DreamInstance['DB'], Schema extends DreamInstance['schema'], TableName extends AssociationTableNames<DB, Schema> & keyof DB = I['dreamInstance']['table'] & keyof DB>(this: I, whereStatement: WhereStatement<DB, Schema, TableName>): Query<DreamInstance>;
585
+ whereNot<I extends DreamClassTransactionBuilder<DreamClass, DreamInstance>, DB extends DreamInstance['DB'], Schema extends DreamInstance['schema'], TableName extends AssociationTableNames<DB, Schema> & keyof DB = I['dreamInstance']['table'] & keyof DB>(this: I, whereStatement: WhereStatement<DB, Schema, TableName>): Query<DreamInstance>;
551
586
  }
@@ -8,15 +8,15 @@ import LeftJoinLoadBuilder from './LeftJoinLoadBuilder.js';
8
8
  import LoadBuilder from './LoadBuilder.js';
9
9
  import Query from './Query.js';
10
10
  export default class DreamInstanceTransactionBuilder<DreamInstance extends Dream> {
11
- dreamInstance: DreamInstance;
12
- dreamTransaction: DreamTransaction<Dream>;
11
+ private dreamInstance;
12
+ private dreamTransaction;
13
13
  /**
14
14
  * Constructs a new DreamInstanceTransactionBuilder.
15
15
  *
16
16
  * @param dreamInstance - The Dream instance to build the transaction for
17
17
  * @param txn - The DreamTransaction instance
18
18
  */
19
- constructor(dreamInstance: DreamInstance, txn: DreamTransaction<Dream>);
19
+ constructor(dreamInstance: DreamInstance, dreamTransaction: DreamTransaction<Dream> | null);
20
20
  /**
21
21
  * Loads the requested associations upon execution
22
22
  *