@rvoh/dream 0.40.3 → 0.40.5

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 (229) 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/findOrCreateBy.js +16 -0
  8. package/dist/cjs/src/dream/internal/updateOrCreateBy.js +18 -0
  9. package/dist/cjs/src/errors/CreateOrUpdateByFailedToCreateAndUpdate.js +18 -0
  10. package/dist/cjs/src/types/associations/belongsTo.js +2 -0
  11. package/dist/cjs/src/types/associations/hasMany.js +2 -0
  12. package/dist/cjs/src/types/associations/hasOne.js +2 -0
  13. package/dist/cjs/src/types/associations/shared.js +2 -0
  14. package/dist/cjs/src/types/db.js +2 -0
  15. package/dist/cjs/src/types/dream.js +2 -0
  16. package/dist/cjs/src/types/lifecycle.js +2 -0
  17. package/dist/cjs/src/types/logger.js +2 -0
  18. package/dist/cjs/src/types/openapi.js +2 -0
  19. package/dist/cjs/src/types/query.js +2 -0
  20. package/dist/cjs/src/types/utils.js +2 -0
  21. package/dist/cjs/src/types/validation.js +2 -0
  22. package/dist/cjs/src/types/variadic.js +2 -0
  23. package/dist/esm/src/Dream.js +64 -12
  24. package/dist/esm/src/dream/DreamClassTransactionBuilder.js +46 -6
  25. package/dist/esm/src/dream/DreamInstanceTransactionBuilder.js +2 -2
  26. package/dist/esm/src/dream/LeftJoinLoadBuilder.js +3 -3
  27. package/dist/esm/src/dream/LoadBuilder.js +3 -3
  28. package/dist/esm/src/dream/internal/associations/createAssociation.js +1 -6
  29. package/dist/esm/src/dream/internal/findOrCreateBy.js +13 -0
  30. package/dist/esm/src/dream/internal/updateOrCreateBy.js +15 -0
  31. package/dist/esm/src/errors/CreateOrUpdateByFailedToCreateAndUpdate.js +15 -0
  32. package/dist/esm/src/types/associations/belongsTo.js +1 -0
  33. package/dist/esm/src/types/associations/hasMany.js +1 -0
  34. package/dist/esm/src/types/associations/hasOne.js +1 -0
  35. package/dist/esm/src/types/associations/shared.js +1 -0
  36. package/dist/esm/src/types/db.js +1 -0
  37. package/dist/esm/src/types/dream.js +1 -0
  38. package/dist/esm/src/types/lifecycle.js +1 -0
  39. package/dist/esm/src/types/logger.js +1 -0
  40. package/dist/esm/src/types/openapi.js +1 -0
  41. package/dist/esm/src/types/query.js +1 -0
  42. package/dist/esm/src/types/utils.js +1 -0
  43. package/dist/esm/src/types/validation.js +1 -0
  44. package/dist/esm/src/types/variadic.js +1 -0
  45. package/dist/types/src/Dream.d.ts +42 -9
  46. package/dist/types/src/dream/DreamClassTransactionBuilder.d.ts +72 -37
  47. package/dist/types/src/dream/DreamInstanceTransactionBuilder.d.ts +3 -3
  48. package/dist/types/src/dream/LeftJoinLoadBuilder.d.ts +2 -2
  49. package/dist/types/src/dream/LoadBuilder.d.ts +2 -2
  50. package/dist/types/src/dream/Query.d.ts +1 -1
  51. package/dist/types/src/dream/internal/findOrCreateBy.d.ts +4 -0
  52. package/dist/types/src/dream/internal/updateOrCreateBy.d.ts +4 -0
  53. package/dist/types/src/errors/CreateOrUpdateByFailedToCreateAndUpdate.d.ts +6 -0
  54. package/dist/types/src/types/associations/belongsTo.d.ts +28 -73
  55. package/dist/types/src/types/associations/belongsTo.ts +76 -0
  56. package/dist/types/src/types/associations/hasMany.d.ts +15 -79
  57. package/dist/types/src/types/associations/hasMany.ts +80 -0
  58. package/dist/types/src/types/associations/hasOne.d.ts +8 -26
  59. package/dist/types/src/types/associations/hasOne.ts +26 -0
  60. package/dist/types/src/types/associations/shared.d.ts +98 -444
  61. package/dist/types/src/types/associations/shared.ts +450 -0
  62. package/dist/types/src/types/db.d.ts +9 -14
  63. package/dist/types/src/types/db.ts +14 -0
  64. package/dist/types/src/types/dream.d.ts +130 -509
  65. package/dist/types/src/types/dream.ts +530 -0
  66. package/dist/types/src/types/lifecycle.d.ts +23 -42
  67. package/dist/types/src/types/lifecycle.ts +50 -0
  68. package/dist/types/src/types/logger.d.ts +6 -40
  69. package/dist/types/src/types/logger.ts +42 -0
  70. package/dist/types/src/types/openapi.d.ts +105 -222
  71. package/dist/types/src/types/openapi.ts +255 -0
  72. package/dist/types/src/types/query.d.ts +53 -161
  73. package/dist/types/src/types/query.ts +165 -0
  74. package/dist/types/src/types/utils.d.ts +83 -141
  75. package/dist/types/src/types/utils.ts +173 -0
  76. package/dist/types/src/types/validation.d.ts +17 -18
  77. package/dist/types/src/types/validation.ts +20 -0
  78. package/dist/types/src/types/variadic.d.ts +42 -444
  79. package/dist/types/src/types/variadic.ts +447 -0
  80. package/docs/assets/search.js +1 -1
  81. package/docs/classes/Benchmark.html +2 -2
  82. package/docs/classes/CalendarDate.html +2 -2
  83. package/docs/classes/CreateOrFindByFailedToCreateAndFind.html +3 -3
  84. package/docs/classes/Decorators.html +19 -19
  85. package/docs/classes/Dream.html +205 -185
  86. package/docs/classes/DreamApp.html +4 -4
  87. package/docs/classes/DreamBin.html +2 -2
  88. package/docs/classes/DreamCLI.html +4 -4
  89. package/docs/classes/DreamImporter.html +2 -2
  90. package/docs/classes/DreamLogos.html +2 -2
  91. package/docs/classes/DreamMigrationHelpers.html +7 -7
  92. package/docs/classes/DreamSerializer.html +2 -2
  93. package/docs/classes/DreamTransaction.html +2 -2
  94. package/docs/classes/Encrypt.html +2 -2
  95. package/docs/classes/Env.html +2 -2
  96. package/docs/classes/GlobalNameNotSet.html +3 -3
  97. package/docs/classes/NonLoadedAssociation.html +3 -3
  98. package/docs/classes/Query.html +53 -53
  99. package/docs/classes/Range.html +2 -2
  100. package/docs/classes/RecordNotFound.html +3 -3
  101. package/docs/classes/ValidationError.html +3 -3
  102. package/docs/functions/Attribute.html +1 -1
  103. package/docs/functions/RendersMany.html +1 -1
  104. package/docs/functions/RendersOne.html +1 -1
  105. package/docs/functions/ReplicaSafe.html +1 -1
  106. package/docs/functions/STI.html +1 -1
  107. package/docs/functions/SoftDelete.html +1 -1
  108. package/docs/functions/camelize.html +1 -1
  109. package/docs/functions/capitalize.html +1 -1
  110. package/docs/functions/closeAllDbConnections.html +1 -1
  111. package/docs/functions/compact.html +1 -1
  112. package/docs/functions/dreamDbConnections.html +1 -1
  113. package/docs/functions/dreamPath.html +1 -1
  114. package/docs/functions/generateDream.html +1 -1
  115. package/docs/functions/globalClassNameFromFullyQualifiedModelName.html +1 -1
  116. package/docs/functions/hyphenize.html +1 -1
  117. package/docs/functions/inferSerializerFromDreamClassOrViewModelClass.html +1 -1
  118. package/docs/functions/inferSerializerFromDreamOrViewModel.html +1 -1
  119. package/docs/functions/isEmpty.html +1 -1
  120. package/docs/functions/loadRepl.html +1 -1
  121. package/docs/functions/lookupClassByGlobalName.html +1 -1
  122. package/docs/functions/pascalize.html +1 -1
  123. package/docs/functions/pgErrorType.html +1 -1
  124. package/docs/functions/range-1.html +1 -1
  125. package/docs/functions/relativeDreamPath.html +1 -1
  126. package/docs/functions/round.html +1 -1
  127. package/docs/functions/serializerNameFromFullyQualifiedModelName.html +1 -1
  128. package/docs/functions/sharedPathPrefix.html +1 -1
  129. package/docs/functions/snakeify.html +1 -1
  130. package/docs/functions/sort.html +1 -1
  131. package/docs/functions/sortBy.html +1 -1
  132. package/docs/functions/standardizeFullyQualifiedModelName.html +1 -1
  133. package/docs/functions/uncapitalize.html +1 -1
  134. package/docs/functions/uniq.html +1 -1
  135. package/docs/functions/untypedDb.html +1 -1
  136. package/docs/functions/validateColumn.html +1 -1
  137. package/docs/functions/validateTable.html +1 -1
  138. package/docs/interfaces/AttributeStatement.html +2 -2
  139. package/docs/interfaces/DecoratorContext.html +2 -2
  140. package/docs/interfaces/DreamAppInitOptions.html +2 -2
  141. package/docs/interfaces/DreamAppOpts.html +2 -2
  142. package/docs/interfaces/DreamSerializerAssociationStatement.html +2 -2
  143. package/docs/interfaces/EncryptOptions.html +2 -2
  144. package/docs/interfaces/OpenapiSchemaProperties.html +1 -1
  145. package/docs/interfaces/OpenapiSchemaPropertiesShorthand.html +1 -1
  146. package/docs/interfaces/OpenapiTypeFieldObject.html +1 -1
  147. package/docs/types/Camelized.html +1 -1
  148. package/docs/types/CommonOpenapiSchemaObjectFields.html +1 -1
  149. package/docs/types/DateTime.html +1 -1
  150. package/docs/types/DbConnectionType.html +1 -1
  151. package/docs/types/DreamAssociationMetadata.html +1 -1
  152. package/docs/types/DreamAttributes.html +1 -1
  153. package/docs/types/DreamClassColumn.html +1 -1
  154. package/docs/types/DreamColumn.html +1 -1
  155. package/docs/types/DreamColumnNames.html +1 -1
  156. package/docs/types/DreamLogLevel.html +1 -1
  157. package/docs/types/DreamLogger.html +1 -1
  158. package/docs/types/DreamOrViewModelSerializerKey.html +1 -1
  159. package/docs/types/DreamParamSafeAttributes.html +1 -1
  160. package/docs/types/DreamParamSafeColumnNames.html +1 -1
  161. package/docs/types/DreamSerializerKey.html +1 -1
  162. package/docs/types/DreamSerializers.html +1 -1
  163. package/docs/types/DreamTableSchema.html +1 -1
  164. package/docs/types/DreamVirtualColumns.html +1 -1
  165. package/docs/types/EncryptAlgorithm.html +1 -1
  166. package/docs/types/Hyphenized.html +1 -1
  167. package/docs/types/IdType.html +1 -1
  168. package/docs/types/OpenapiAllTypes.html +1 -1
  169. package/docs/types/OpenapiFormats.html +1 -1
  170. package/docs/types/OpenapiNumberFormats.html +1 -1
  171. package/docs/types/OpenapiPrimitiveTypes.html +1 -1
  172. package/docs/types/OpenapiSchemaArray.html +1 -1
  173. package/docs/types/OpenapiSchemaArrayShorthand.html +1 -1
  174. package/docs/types/OpenapiSchemaBase.html +1 -1
  175. package/docs/types/OpenapiSchemaBody.html +1 -1
  176. package/docs/types/OpenapiSchemaBodyShorthand.html +1 -1
  177. package/docs/types/OpenapiSchemaCommonFields.html +1 -1
  178. package/docs/types/OpenapiSchemaExpressionAllOf.html +1 -1
  179. package/docs/types/OpenapiSchemaExpressionAnyOf.html +1 -1
  180. package/docs/types/OpenapiSchemaExpressionOneOf.html +1 -1
  181. package/docs/types/OpenapiSchemaExpressionRef.html +1 -1
  182. package/docs/types/OpenapiSchemaExpressionRefSchemaShorthand.html +1 -1
  183. package/docs/types/OpenapiSchemaInteger.html +1 -1
  184. package/docs/types/OpenapiSchemaNull.html +1 -1
  185. package/docs/types/OpenapiSchemaNumber.html +1 -1
  186. package/docs/types/OpenapiSchemaObject.html +1 -1
  187. package/docs/types/OpenapiSchemaObjectAllOf.html +1 -1
  188. package/docs/types/OpenapiSchemaObjectAllOfShorthand.html +1 -1
  189. package/docs/types/OpenapiSchemaObjectAnyOf.html +1 -1
  190. package/docs/types/OpenapiSchemaObjectAnyOfShorthand.html +1 -1
  191. package/docs/types/OpenapiSchemaObjectBase.html +1 -1
  192. package/docs/types/OpenapiSchemaObjectBaseShorthand.html +1 -1
  193. package/docs/types/OpenapiSchemaObjectOneOf.html +1 -1
  194. package/docs/types/OpenapiSchemaObjectOneOfShorthand.html +1 -1
  195. package/docs/types/OpenapiSchemaObjectShorthand.html +1 -1
  196. package/docs/types/OpenapiSchemaPrimitiveGeneric.html +1 -1
  197. package/docs/types/OpenapiSchemaShorthandExpressionAllOf.html +1 -1
  198. package/docs/types/OpenapiSchemaShorthandExpressionAnyOf.html +1 -1
  199. package/docs/types/OpenapiSchemaShorthandExpressionOneOf.html +1 -1
  200. package/docs/types/OpenapiSchemaShorthandExpressionSerializableRef.html +1 -1
  201. package/docs/types/OpenapiSchemaShorthandExpressionSerializerRef.html +1 -1
  202. package/docs/types/OpenapiSchemaShorthandPrimitiveGeneric.html +1 -1
  203. package/docs/types/OpenapiSchemaString.html +1 -1
  204. package/docs/types/OpenapiShorthandAllTypes.html +1 -1
  205. package/docs/types/OpenapiShorthandPrimitiveTypes.html +1 -1
  206. package/docs/types/OpenapiTypeField.html +1 -1
  207. package/docs/types/Pascalized.html +1 -1
  208. package/docs/types/PrimaryKeyType.html +1 -1
  209. package/docs/types/RoundingPrecision.html +1 -1
  210. package/docs/types/SerializableClassOrSerializerCallback.html +1 -1
  211. package/docs/types/SerializableDreamClassOrViewModelClass.html +1 -1
  212. package/docs/types/SerializableDreamOrViewModel.html +1 -1
  213. package/docs/types/SerializableTypes.html +1 -1
  214. package/docs/types/Snakeified.html +1 -1
  215. package/docs/types/Timestamp.html +1 -1
  216. package/docs/types/UpdateableAssociationProperties.html +1 -1
  217. package/docs/types/UpdateableProperties.html +1 -1
  218. package/docs/types/ValidationType.html +1 -1
  219. package/docs/types/ViewModelSerializerKey.html +1 -1
  220. package/docs/types/WhereStatementForDream.html +1 -1
  221. package/docs/types/WhereStatementForDreamClass.html +1 -1
  222. package/docs/variables/DateTime-1.html +1 -1
  223. package/docs/variables/DreamConst.html +1 -1
  224. package/docs/variables/TRIGRAM_OPERATORS.html +1 -1
  225. package/docs/variables/openapiPrimitiveTypes-1.html +1 -1
  226. package/docs/variables/openapiShorthandPrimitiveTypes-1.html +1 -1
  227. package/docs/variables/ops.html +1 -1
  228. package/docs/variables/primaryKeyTypes.html +1 -1
  229. package/package.json +1 -1
@@ -0,0 +1,450 @@
1
+ import {
2
+ ComparisonOperatorExpression as KyselyComparisonOperatorExpression,
3
+ SelectQueryBuilder,
4
+ Updateable,
5
+ } from 'kysely'
6
+ import Dream from '../../Dream.js'
7
+ import { DreamConst } from '../../dream/constants.js'
8
+ import CalendarDate from '../../helpers/CalendarDate.js'
9
+ import { DateTime } from '../../helpers/DateTime.js'
10
+ import { Range } from '../../helpers/range.js'
11
+ import CurriedOpsStatement from '../../ops/curried-ops-statement.js'
12
+ import OpsStatement, { ExtraSimilarityArgs } from '../../ops/ops-statement.js'
13
+ import { AssociationTableNames } from '../db.js'
14
+ import {
15
+ DefaultScopeName,
16
+ DefaultScopeNameForTable,
17
+ DreamBelongsToAssociationMetadata,
18
+ DreamColumnNames,
19
+ GlobalModelNameTableMap,
20
+ IdType,
21
+ OrderDir,
22
+ TableColumnEnumTypeArray,
23
+ TableColumnNames,
24
+ TableColumnType,
25
+ TableNameForGlobalModelName,
26
+ TrigramOperator,
27
+ } from '../dream.js'
28
+ import { Inc, MergeUnionOfRecordTypes, ReadonlyTail, UnionToIntersection } from '../utils.js'
29
+ import { JoinedAssociation } from '../variadic.js'
30
+ import { BelongsToStatement } from './belongsTo.js'
31
+ import { HasManyStatement } from './hasMany.js'
32
+ import { HasOneStatement } from './hasOne.js'
33
+
34
+ export type MAX_JOINED_TABLES_DEPTH = 25
35
+
36
+ export type AssociationMetadataMap = Record<string, AssociationStatement>
37
+
38
+ export type AssociatedBelongsToModelType<
39
+ I extends Dream,
40
+ AssociationName extends keyof DreamBelongsToAssociationMetadata<I>,
41
+ PossibleArrayAssociationType extends I[AssociationName & keyof I] = I[AssociationName & keyof I],
42
+ AssociationType extends PossibleArrayAssociationType extends (infer ElementType)[]
43
+ ? ElementType
44
+ : PossibleArrayAssociationType = PossibleArrayAssociationType extends (infer ElementType)[]
45
+ ? ElementType
46
+ : PossibleArrayAssociationType,
47
+ > = AssociationType
48
+
49
+ // For sending a BelongsTo model into a statement such as `await Post.create({ user })`
50
+
51
+ export type AssociatedModelParam<
52
+ I extends Dream,
53
+ AssociationExists = keyof DreamBelongsToAssociationMetadata<I> extends never ? false : true,
54
+ AssociationName = AssociationExists extends false
55
+ ? never
56
+ : keyof DreamBelongsToAssociationMetadata<I> & string,
57
+ RetObj = AssociationExists extends false
58
+ ? never
59
+ : AssociationName extends never
60
+ ? never
61
+ : {
62
+ [K in AssociationName &
63
+ keyof DreamBelongsToAssociationMetadata<I> &
64
+ string]: AssociatedBelongsToModelType<I, K> | null
65
+ },
66
+ > = Partial<UnionToIntersection<RetObj>>
67
+
68
+ export type PassthroughOnClause<PassthroughColumns extends string[]> = Partial<
69
+ Record<PassthroughColumns[number], any>
70
+ >
71
+ type DreamSelectable<DB, Schema, TableName extends AssociationTableNames<DB, Schema> & keyof DB> = Partial<{
72
+ [ColumnName in keyof DB[TableName]]: NonKyselySupportedSupplementalWhereClauseValues<
73
+ DB,
74
+ Schema,
75
+ TableName,
76
+ ColumnName
77
+ >
78
+ }>
79
+ type NonKyselySupportedSupplementalWhereClauseValues<
80
+ DB,
81
+ Schema,
82
+ TableName,
83
+ Column,
84
+ ColumnType = TableColumnType<Schema, TableName, Column>,
85
+ EnumTypeArray extends string[] | null = TableColumnEnumTypeArray<Schema, TableName, Column>,
86
+ PermanentOpsValTypes = null | readonly [],
87
+ OpsValType = EnumTypeArray extends string[]
88
+ ? EnumTypeArray[number] | PermanentOpsValTypes
89
+ : ColumnType | PermanentOpsValTypes,
90
+ PartialTypes = EnumTypeArray extends null
91
+ ? ColumnType extends DateTime
92
+ ?
93
+ | DateTime[]
94
+ | Range<DateTime>
95
+ | (() => Range<DateTime>)
96
+ | Range<CalendarDate>
97
+ | (() => Range<CalendarDate>)
98
+ | OpsStatement<KyselyComparisonOperatorExpression, OpsValType, any>
99
+ : ColumnType extends CalendarDate
100
+ ?
101
+ | CalendarDate[]
102
+ | Range<CalendarDate>
103
+ | (() => Range<CalendarDate>)
104
+ | Range<DateTime>
105
+ | (() => Range<DateTime>)
106
+ | OpsStatement<KyselyComparisonOperatorExpression, OpsValType>
107
+ : ColumnType extends number
108
+ ?
109
+ | (number | bigint)[]
110
+ | Range<number>
111
+ | OpsStatement<KyselyComparisonOperatorExpression, OpsValType, any>
112
+ : ColumnType extends string
113
+ ?
114
+ | string[]
115
+ | OpsStatement<KyselyComparisonOperatorExpression, string, any>
116
+ | OpsStatement<TrigramOperator, OpsValType, ExtraSimilarityArgs>
117
+ : ColumnType extends IdType
118
+ ? IdType[] | OpsStatement<KyselyComparisonOperatorExpression, OpsValType, any>
119
+ : never
120
+ : EnumTypeArray extends string[]
121
+ ? EnumTypeArray | OpsStatement<KyselyComparisonOperatorExpression, OpsValType, any>
122
+ : never,
123
+ > = PartialTypes extends never
124
+ ?
125
+ | OpsStatement<KyselyComparisonOperatorExpression, OpsValType, any>
126
+ | CurriedOpsStatement<any, any, any, OpsValType>
127
+ | SelectQueryBuilder<DB, keyof DB, any>
128
+ : PartialTypes | CurriedOpsStatement<any, any, any, OpsValType> | SelectQueryBuilder<DB, keyof DB, any>
129
+
130
+ export type WhereStatementForDreamClass<DreamClass extends typeof Dream> = WhereStatement<
131
+ InstanceType<DreamClass>['DB'],
132
+ InstanceType<DreamClass>['schema'],
133
+ InstanceType<DreamClass>['table']
134
+ >
135
+
136
+ export type WhereStatementForDream<DreamInstance extends Dream> = WhereStatement<
137
+ DreamInstance['DB'],
138
+ DreamInstance['schema'],
139
+ DreamInstance['table']
140
+ >
141
+ type AssociationNameToDotReferencedColumns<
142
+ DB,
143
+ TableName extends keyof DB,
144
+ AssociationName,
145
+ > = `${AssociationName & string}.${TableColumnNames<DB, TableName>}`
146
+
147
+ export type ColumnNamesAccountingForJoinedAssociations<
148
+ JoinedAssociations extends Readonly<JoinedAssociation[]>,
149
+ DB,
150
+ RootTableName extends keyof DB,
151
+ RootTableAlias extends string,
152
+ > = JoinedAssociations['length'] extends 0
153
+ ? TableColumnNames<DB, RootTableName> // no associations; simply return the un-namespaced columns for the root table
154
+ : JoinedAssociationColumnNames<
155
+ JoinedAssociations,
156
+ DB,
157
+ // namespace columns for the root table
158
+ AssociationNameToDotReferencedColumns<DB, RootTableName & keyof DB, RootTableAlias>
159
+ >
160
+ type JoinedAssociationColumnNames<
161
+ JoinedAssociations extends Readonly<JoinedAssociation[]>,
162
+ DB,
163
+ AllColumnNames,
164
+ Depth extends number = 0,
165
+ CurrentJoinedAssociation = Readonly<JoinedAssociations[0]>,
166
+ NextTableName = CurrentJoinedAssociation extends Readonly<JoinedAssociation>
167
+ ? CurrentJoinedAssociation['table']
168
+ : never,
169
+ NextAssociationName = CurrentJoinedAssociation extends Readonly<JoinedAssociation>
170
+ ? CurrentJoinedAssociation['alias']
171
+ : never,
172
+ > = JoinedAssociations['length'] extends 0
173
+ ? AllColumnNames
174
+ : Depth extends MAX_JOINED_TABLES_DEPTH
175
+ ? AllColumnNames
176
+ : JoinedAssociationColumnNames<
177
+ ReadonlyTail<JoinedAssociations>,
178
+ DB,
179
+ | AllColumnNames
180
+ | AssociationNameToDotReferencedColumns<DB, NextTableName & keyof DB, NextAssociationName>,
181
+ Inc<Depth>
182
+ >
183
+
184
+ export type WhereStatement<
185
+ DB,
186
+ Schema,
187
+ TableName extends AssociationTableNames<DB, Schema> & keyof DB,
188
+ > = Partial<MergeUnionOfRecordTypes<Updateable<DB[TableName]> | DreamSelectable<DB, Schema, TableName>>>
189
+
190
+ export type OnStatementForAssociation<
191
+ DB,
192
+ Schema,
193
+ TableName extends AssociationTableNames<DB, Schema> & keyof DB,
194
+ RequiredOnClauseKeysForThisAssociation,
195
+ OnStatement extends WhereStatement<DB, Schema, TableName> = WhereStatement<DB, Schema, TableName>,
196
+ > = RequiredOnClauseKeysForThisAssociation extends null
197
+ ? WhereStatement<DB, Schema, TableName>
198
+ : RequiredOnClauseKeysForThisAssociation extends string[]
199
+ ? Required<Pick<OnStatement, RequiredOnClauseKeysForThisAssociation[number] & keyof OnStatement>> &
200
+ Partial<Omit<OnStatement, RequiredOnClauseKeysForThisAssociation[number] & keyof OnStatement>>
201
+ : never
202
+ // on statement on an association definition
203
+ type OnStatementForAssociationDefinition<
204
+ DB,
205
+ Schema,
206
+ TableName extends AssociationTableNames<DB, Schema> & keyof DB,
207
+ > = Partial<
208
+ MergeUnionOfRecordTypes<
209
+ | Updateable<DB[TableName]>
210
+ | Partial<{
211
+ [ColumnName in keyof DB[TableName]]:
212
+ | NonKyselySupportedSupplementalWhereClauseValues<DB, Schema, TableName, ColumnName>
213
+ | typeof DreamConst.passthrough
214
+ | typeof DreamConst.required
215
+ }>
216
+ >
217
+ >
218
+
219
+ export type SelfOnStatement<
220
+ BaseInstance extends Dream,
221
+ DB,
222
+ Schema,
223
+ TableName extends AssociationTableNames<DB, Schema> & keyof DB,
224
+ > = Partial<Record<keyof DB[TableName], DreamColumnNames<BaseInstance>>>
225
+
226
+ export type WhereStatementForJoinedAssociation<
227
+ JoinedAssociations extends Readonly<JoinedAssociation[]>,
228
+ DB,
229
+ Schema,
230
+ TableName extends AssociationTableNames<DB, Schema> & keyof DB,
231
+ > = RecursiveWhereStatementForJoinedAssociation<
232
+ JoinedAssociations,
233
+ DB,
234
+ Schema,
235
+ WhereStatement<DB, Schema, TableName>
236
+ >
237
+ type RecursiveWhereStatementForJoinedAssociation<
238
+ JoinedAssociations extends Readonly<JoinedAssociation[]>,
239
+ DB,
240
+ Schema,
241
+ OriginalOnStatement,
242
+ Depth extends number = 0,
243
+ CurrentJoinedAssociation = JoinedAssociations[0],
244
+ TableName = CurrentJoinedAssociation extends JoinedAssociation ? CurrentJoinedAssociation['table'] : never,
245
+ AssociationName = CurrentJoinedAssociation extends JoinedAssociation
246
+ ? CurrentJoinedAssociation['alias']
247
+ : never,
248
+ NonNamespacedAssociationOnStatement = TableName extends never
249
+ ? never
250
+ : AssociationName extends never
251
+ ? never
252
+ : WhereStatement<DB, Schema, TableName & AssociationTableNames<DB, Schema> & keyof DB>,
253
+ NextOnStatement = NonNamespacedAssociationOnStatement extends never
254
+ ? OriginalOnStatement
255
+ : OriginalOnStatement & {
256
+ [K in keyof NonNamespacedAssociationOnStatement as `${AssociationName & string}.${K & string}`]: NonNamespacedAssociationOnStatement[K &
257
+ keyof NonNamespacedAssociationOnStatement]
258
+ },
259
+ > = JoinedAssociations['length'] extends 0
260
+ ? OriginalOnStatement
261
+ : Depth extends MAX_JOINED_TABLES_DEPTH
262
+ ? OriginalOnStatement
263
+ : TableName extends never
264
+ ? OriginalOnStatement
265
+ : RecursiveWhereStatementForJoinedAssociation<
266
+ ReadonlyTail<JoinedAssociations>,
267
+ DB,
268
+ Schema,
269
+ NextOnStatement,
270
+ Inc<Depth>
271
+ >
272
+
273
+ export type OrderStatement<DB, Schema, TableName extends AssociationTableNames<DB, Schema> & keyof DB> =
274
+ | TableColumnNames<DB, TableName>
275
+ | Partial<Record<TableColumnNames<DB, TableName>, OrderDir>>
276
+
277
+ export type LimitStatement = number
278
+ export type OffsetStatement = number
279
+
280
+ export type OrderQueryStatement<ColumnType> = {
281
+ column: ColumnType & string
282
+ direction: OrderDir
283
+ }
284
+
285
+ export interface HasStatement<
286
+ BaseInstance extends Dream,
287
+ DB,
288
+ Schema,
289
+ ForeignTableName extends AssociationTableNames<DB, Schema> & keyof DB,
290
+ HasType extends 'HasOne' | 'HasMany',
291
+ > {
292
+ modelCB: () => typeof Dream
293
+ as: string
294
+ dependent?: DependentOptions
295
+ foreignKey: () => keyof DB[ForeignTableName] & string
296
+ foreignKeyTypeField: () => keyof DB[ForeignTableName] & string
297
+ globalAssociationNameOrNames: string[]
298
+ and?: OnStatementForAssociationDefinition<DB, Schema, ForeignTableName>
299
+ andNot?: WhereStatement<DB, Schema, ForeignTableName>
300
+ andAny?: WhereStatement<DB, Schema, ForeignTableName>[]
301
+ // ATTENTION
302
+ //
303
+ // Using `order` with HasOne is tempting as an elegant API
304
+ // (e.g. a `currentXyz` variant of a `currentXyzs` HasMany
305
+ // association by ordering on `createdAt`); however, it
306
+ // creates a fundamental problem when querying through the
307
+ // HasMany association: we can't `limit(1)` as part of the
308
+ // query because multiple records may match the HasMany
309
+ // association, each of which may HaveOne of the subsequent
310
+ // association
311
+ polymorphic: boolean
312
+ preloadThroughColumns?: string[] | Record<string, string>
313
+ primaryKey: (associationInstance?: Dream) => DreamColumnNames<BaseInstance>
314
+ primaryKeyOverride?: DreamColumnNames<BaseInstance> | null
315
+ primaryKeyValue: (associationInstance: Dream) => any
316
+ selfAnd?: SelfOnStatement<BaseInstance, DB, Schema, ForeignTableName>
317
+ selfAndNot?: SelfOnStatement<BaseInstance, DB, Schema, ForeignTableName>
318
+ source: string
319
+ through?: string
320
+ type: HasType
321
+ withoutDefaultScopes?: DefaultScopeName<BaseInstance>[]
322
+ }
323
+
324
+ interface HasOptionsBase<
325
+ BaseInstance extends Dream,
326
+ AssociationGlobalName extends keyof GlobalModelNameTableMap<BaseInstance>,
327
+ AssociationTableName = TableNameForGlobalModelName<
328
+ BaseInstance,
329
+ AssociationGlobalName & keyof GlobalModelNameTableMap<BaseInstance>
330
+ >,
331
+ > {
332
+ dependent?: DependentOptions
333
+ foreignKey?: TableColumnNames<BaseInstance['DB'], AssociationTableName & keyof BaseInstance['DB']>
334
+
335
+ and?: OnStatementForAssociationDefinition<
336
+ BaseInstance['DB'],
337
+ BaseInstance['schema'],
338
+ AssociationTableName &
339
+ AssociationTableNames<BaseInstance['DB'], BaseInstance['schema']> &
340
+ keyof BaseInstance['DB']
341
+ >
342
+
343
+ andNot?: WhereStatement<
344
+ BaseInstance['DB'],
345
+ BaseInstance['schema'],
346
+ AssociationTableName &
347
+ AssociationTableNames<BaseInstance['DB'], BaseInstance['schema']> &
348
+ keyof BaseInstance['DB']
349
+ >
350
+
351
+ andAny?: WhereStatement<
352
+ BaseInstance['DB'],
353
+ BaseInstance['schema'],
354
+ AssociationTableName &
355
+ AssociationTableNames<BaseInstance['DB'], BaseInstance['schema']> &
356
+ keyof BaseInstance['DB']
357
+ >[]
358
+
359
+ polymorphic?: boolean
360
+ preloadThroughColumns?: string[] | Record<string, string>
361
+ primaryKeyOverride?: DreamColumnNames<BaseInstance> | null
362
+
363
+ selfAnd?: SelfOnStatement<
364
+ BaseInstance,
365
+ BaseInstance['DB'],
366
+ BaseInstance['schema'],
367
+ AssociationTableName &
368
+ AssociationTableNames<BaseInstance['DB'], BaseInstance['schema']> &
369
+ keyof BaseInstance['DB']
370
+ >
371
+
372
+ selfAndNot?: SelfOnStatement<
373
+ BaseInstance,
374
+ BaseInstance['DB'],
375
+ BaseInstance['schema'],
376
+ AssociationTableName &
377
+ AssociationTableNames<BaseInstance['DB'], BaseInstance['schema']> &
378
+ keyof BaseInstance['DB']
379
+ >
380
+
381
+ source?: string
382
+ through?: keyof BaseInstance['schema'][BaseInstance['table']]['associations']
383
+
384
+ withoutDefaultScopes?: DefaultScopeNameForTable<
385
+ BaseInstance['schema'],
386
+ AssociationTableName & keyof BaseInstance['DB']
387
+ >[]
388
+ }
389
+
390
+ export type PolymorphicOption = 'polymorphic'
391
+ export type ForeignKeyOption = 'foreignKey'
392
+ type ThroughIncompatibleOptions =
393
+ | 'dependent'
394
+ | 'primaryKeyOverride'
395
+ | 'withoutDefaultScopes'
396
+ | ForeignKeyOption
397
+ | PolymorphicOption
398
+ type ThroughOnlyOptions = 'through' | 'source' | 'preloadThroughColumns'
399
+
400
+ export type HasOptions<
401
+ BaseInstance extends Dream,
402
+ AssociationGlobalName extends keyof GlobalModelNameTableMap<BaseInstance>,
403
+ > = Omit<HasOptionsBase<BaseInstance, AssociationGlobalName>, ThroughOnlyOptions | PolymorphicOption>
404
+
405
+ export type PolymorphicHasOptions<
406
+ BaseInstance extends Dream,
407
+ AssociationGlobalName extends keyof GlobalModelNameTableMap<BaseInstance>,
408
+ > = HasOptionsBase<BaseInstance, AssociationGlobalName> &
409
+ Required<Pick<HasOptionsBase<BaseInstance, AssociationGlobalName>, PolymorphicOption | ForeignKeyOption>>
410
+
411
+ export type HasThroughOptions<
412
+ BaseInstance extends Dream,
413
+ AssociationGlobalName extends keyof GlobalModelNameTableMap<BaseInstance>,
414
+ > = Omit<HasOptionsBase<BaseInstance, AssociationGlobalName>, ThroughIncompatibleOptions>
415
+
416
+ export interface AssociationStatementsMap {
417
+ belongsTo: readonly BelongsToStatement<any, any, any, any>[] | BelongsToStatement<any, any, any, any>[]
418
+ hasMany: readonly HasManyStatement<any, any, any, any>[] | HasManyStatement<any, any, any, any>[]
419
+ hasOne: readonly HasOneStatement<any, any, any, any>[] | HasOneStatement<any, any, any, any>[]
420
+ }
421
+
422
+ export type DependentOptions = 'destroy'
423
+ type partialTypeFields =
424
+ | 'modelCB'
425
+ | 'type'
426
+ | 'polymorphic'
427
+ | 'as'
428
+ | 'primaryKey'
429
+ | 'primaryKeyValue'
430
+ | 'primaryKeyOverride'
431
+ type hasOneManySpecificFields =
432
+ | 'source'
433
+ | 'through'
434
+ | 'preloadThroughColumns'
435
+ | 'and'
436
+ | 'andNot'
437
+ | 'andAny'
438
+ | 'selfAnd'
439
+ | 'selfAndNot'
440
+ type belongsToSpecificFields = 'optional'
441
+
442
+ export type PartialAssociationStatement =
443
+ | Pick<HasManyStatement<any, any, any, any>, partialTypeFields | hasOneManySpecificFields>
444
+ | Pick<HasOneStatement<any, any, any, any>, partialTypeFields | hasOneManySpecificFields>
445
+ | Pick<BelongsToStatement<any, any, any, any>, partialTypeFields | belongsToSpecificFields>
446
+
447
+ export type AssociationStatement =
448
+ | HasManyStatement<any, any, any, any>
449
+ | HasOneStatement<any, any, any, any>
450
+ | BelongsToStatement<any, any, any, any>
@@ -1,14 +1,9 @@
1
- import { postgresDatatypes } from '../db/dataTypes.ts'
2
-
3
- export type DbConnectionType = 'primary' | 'replica'
4
-
5
- export type AssociationTableNames<DB, Schema> = keyof DB & keyof Schema extends never
6
- ? unknown
7
- : keyof DB & keyof Schema & string
8
- export type Tables<DB> = keyof DB
9
- export type TableInterfaces<DB> = valueof<DB>
10
-
11
- type valueof<T> = T[keyof T]
12
-
13
- export type NonArrayDbTypes = (typeof postgresDatatypes)[number]
14
- export type DbTypes = NonArrayDbTypes | `${NonArrayDbTypes}[]`
1
+ import { postgresDatatypes } from '../db/dataTypes.js';
2
+ export type DbConnectionType = 'primary' | 'replica';
3
+ export type AssociationTableNames<DB, Schema> = keyof DB & keyof Schema extends never ? unknown : keyof DB & keyof Schema & string;
4
+ export type Tables<DB> = keyof DB;
5
+ export type TableInterfaces<DB> = valueof<DB>;
6
+ type valueof<T> = T[keyof T];
7
+ export type NonArrayDbTypes = (typeof postgresDatatypes)[number];
8
+ export type DbTypes = NonArrayDbTypes | `${NonArrayDbTypes}[]`;
9
+ export {};
@@ -0,0 +1,14 @@
1
+ import { postgresDatatypes } from '../db/dataTypes.js'
2
+
3
+ export type DbConnectionType = 'primary' | 'replica'
4
+
5
+ export type AssociationTableNames<DB, Schema> = keyof DB & keyof Schema extends never
6
+ ? unknown
7
+ : keyof DB & keyof Schema & string
8
+ export type Tables<DB> = keyof DB
9
+ export type TableInterfaces<DB> = valueof<DB>
10
+
11
+ type valueof<T> = T[keyof T]
12
+
13
+ export type NonArrayDbTypes = (typeof postgresDatatypes)[number]
14
+ export type DbTypes = NonArrayDbTypes | `${NonArrayDbTypes}[]`