@rvoh/dream 1.4.2 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/dist/cjs/src/Dream.js +12 -16
  2. package/dist/cjs/src/bin/index.js +23 -7
  3. package/dist/cjs/src/cli/index.js +18 -3
  4. package/dist/cjs/src/db/ConnectedToDB.js +0 -8
  5. package/dist/cjs/src/db/DreamDbConnection.js +25 -36
  6. package/dist/cjs/src/db/helpers/dbTypesFilenameForConnection.js +6 -0
  7. package/dist/cjs/src/{bin/helpers/sync.js → db/helpers/syncDbTypesFiles.js} +8 -5
  8. package/dist/cjs/src/db/index.js +3 -2
  9. package/dist/cjs/src/db/migration-helpers/DreamMigrationHelpers.js +36 -0
  10. package/dist/cjs/src/decorators/field/sortable/helpers/setPosition.js +17 -2
  11. package/dist/cjs/src/dream/Query.js +9 -6
  12. package/dist/cjs/src/dream/QueryDriver/Base.js +111 -7
  13. package/dist/cjs/src/dream/QueryDriver/Kysely.js +213 -86
  14. package/dist/cjs/src/dream/QueryDriver/Postgres.js +162 -0
  15. package/dist/cjs/src/{helpers/db → dream/QueryDriver/helpers/kysely}/runMigration.js +22 -17
  16. package/dist/cjs/src/{helpers/db → dream/QueryDriver/helpers/pg}/createDb.js +5 -5
  17. package/dist/cjs/src/{helpers/db → dream/QueryDriver/helpers/pg}/dropDb.js +6 -6
  18. package/dist/cjs/src/{helpers/db → dream/QueryDriver/helpers/pg}/loadPgClient.js +5 -3
  19. package/dist/cjs/src/dream/internal/destroyDream.js +3 -10
  20. package/dist/cjs/src/dream/internal/saveDream.js +1 -1
  21. package/dist/cjs/src/dream/internal/similarity/SimilarityBuilder.js +9 -3
  22. package/dist/cjs/src/dream-app/index.js +47 -64
  23. package/dist/cjs/src/helpers/cli/SchemaBuilder.js +30 -42
  24. package/dist/cjs/src/helpers/cli/generateDream.js +2 -0
  25. package/dist/cjs/src/helpers/cli/generateDreamContent.js +5 -3
  26. package/dist/cjs/src/helpers/cli/generateFactoryContent.js +29 -0
  27. package/dist/cjs/src/helpers/cli/generateMigration.js +7 -5
  28. package/dist/cjs/src/helpers/cli/generateMigrationContent.js +48 -15
  29. package/dist/cjs/src/helpers/db/primaryKeyType.js +4 -22
  30. package/dist/cjs/src/helpers/sqlAttributes.js +4 -1
  31. package/dist/cjs/src/index.js +8 -2
  32. package/dist/esm/src/Dream.js +10 -14
  33. package/dist/esm/src/bin/index.js +23 -7
  34. package/dist/esm/src/cli/index.js +18 -3
  35. package/dist/esm/src/db/ConnectedToDB.js +0 -8
  36. package/dist/esm/src/db/DreamDbConnection.js +22 -34
  37. package/dist/esm/src/db/helpers/dbTypesFilenameForConnection.js +3 -0
  38. package/dist/esm/src/{bin/helpers/sync.js → db/helpers/syncDbTypesFiles.js} +7 -4
  39. package/dist/esm/src/db/index.js +3 -2
  40. package/dist/esm/src/db/migration-helpers/DreamMigrationHelpers.js +36 -0
  41. package/dist/esm/src/decorators/field/sortable/helpers/setPosition.js +16 -2
  42. package/dist/esm/src/dream/Query.js +9 -6
  43. package/dist/esm/src/dream/QueryDriver/Base.js +111 -7
  44. package/dist/esm/src/dream/QueryDriver/Kysely.js +215 -88
  45. package/dist/esm/src/dream/QueryDriver/Postgres.js +162 -0
  46. package/dist/esm/src/{helpers/db → dream/QueryDriver/helpers/kysely}/runMigration.js +16 -11
  47. package/dist/esm/src/{helpers/db → dream/QueryDriver/helpers/pg}/createDb.js +5 -5
  48. package/dist/esm/src/{helpers/db → dream/QueryDriver/helpers/pg}/dropDb.js +6 -6
  49. package/dist/esm/src/{helpers/db → dream/QueryDriver/helpers/pg}/loadPgClient.js +5 -3
  50. package/dist/esm/src/dream/internal/destroyDream.js +3 -10
  51. package/dist/esm/src/dream/internal/saveDream.js +1 -1
  52. package/dist/esm/src/dream/internal/similarity/SimilarityBuilder.js +9 -3
  53. package/dist/esm/src/dream-app/index.js +44 -61
  54. package/dist/esm/src/helpers/cli/SchemaBuilder.js +24 -36
  55. package/dist/esm/src/helpers/cli/generateDream.js +2 -0
  56. package/dist/esm/src/helpers/cli/generateDreamContent.js +5 -3
  57. package/dist/esm/src/helpers/cli/generateFactoryContent.js +29 -0
  58. package/dist/esm/src/helpers/cli/generateMigration.js +7 -5
  59. package/dist/esm/src/helpers/cli/generateMigrationContent.js +48 -15
  60. package/dist/esm/src/helpers/db/primaryKeyType.js +4 -22
  61. package/dist/esm/src/helpers/sqlAttributes.js +4 -1
  62. package/dist/esm/src/index.js +3 -0
  63. package/dist/types/src/Dream.d.ts +5 -3
  64. package/dist/types/src/bin/index.d.ts +3 -1
  65. package/dist/types/src/db/ConnectedToDB.d.ts +0 -2
  66. package/dist/types/src/db/DreamDbConnection.d.ts +7 -3
  67. package/dist/types/src/db/helpers/dbTypesFilenameForConnection.d.ts +1 -0
  68. package/dist/types/src/db/helpers/syncDbTypesFiles.d.ts +1 -0
  69. package/dist/types/src/db/index.d.ts +2 -1
  70. package/dist/types/src/db/migration-helpers/DreamMigrationHelpers.d.ts +36 -0
  71. package/dist/types/src/decorators/field/sortable/helpers/setPosition.d.ts +2 -0
  72. package/dist/types/src/dream/Query.d.ts +5 -20
  73. package/dist/types/src/dream/QueryDriver/Base.d.ts +74 -13
  74. package/dist/types/src/dream/QueryDriver/Kysely.d.ts +75 -9
  75. package/dist/types/src/dream/QueryDriver/Postgres.d.ts +32 -0
  76. package/dist/types/src/dream/QueryDriver/helpers/kysely/foreignKeyTypeFromPrimaryKey.d.ts +2 -0
  77. package/dist/types/src/dream/QueryDriver/helpers/kysely/runMigration.d.ts +9 -0
  78. package/dist/types/src/dream/QueryDriver/helpers/pg/createDb.d.ts +2 -0
  79. package/dist/types/src/dream/QueryDriver/helpers/pg/dropDb.d.ts +2 -0
  80. package/dist/types/src/dream/QueryDriver/helpers/pg/loadPgClient.d.ts +5 -0
  81. package/dist/types/src/dream/internal/destroyOptions.d.ts +3 -3
  82. package/dist/types/src/dream-app/index.d.ts +11 -6
  83. package/dist/types/src/helpers/cli/SchemaBuilder.d.ts +26 -0
  84. package/dist/types/src/helpers/cli/generateDream.d.ts +1 -0
  85. package/dist/types/src/helpers/cli/generateDreamContent.d.ts +2 -1
  86. package/dist/types/src/helpers/cli/generateMigration.d.ts +2 -1
  87. package/dist/types/src/helpers/cli/generateMigrationContent.d.ts +2 -1
  88. package/dist/types/src/helpers/db/primaryKeyType.d.ts +1 -1
  89. package/dist/types/src/index.d.ts +3 -0
  90. package/dist/types/src/types/dream.d.ts +4 -4
  91. package/dist/types/src/types/dream.ts +8 -9
  92. package/docs/assets/navigation.js +1 -1
  93. package/docs/assets/search.js +1 -1
  94. package/docs/classes/Benchmark.html +2 -2
  95. package/docs/classes/CalendarDate.html +2 -2
  96. package/docs/classes/CheckConstraintViolation.html +3 -3
  97. package/docs/classes/CliFileWriter.html +2 -2
  98. package/docs/classes/CreateOrFindByFailedToCreateAndFind.html +3 -3
  99. package/docs/classes/DataTypeColumnTypeMismatch.html +3 -3
  100. package/docs/classes/Decorators.html +19 -19
  101. package/docs/classes/Dream.html +117 -115
  102. package/docs/classes/DreamApp.html +8 -5
  103. package/docs/classes/DreamBin.html +2 -2
  104. package/docs/classes/DreamCLI.html +4 -4
  105. package/docs/classes/DreamImporter.html +2 -2
  106. package/docs/classes/DreamLogos.html +2 -2
  107. package/docs/classes/DreamMigrationHelpers.html +19 -7
  108. package/docs/classes/DreamSerializerBuilder.html +8 -8
  109. package/docs/classes/DreamTransaction.html +2 -2
  110. package/docs/classes/Encrypt.html +2 -2
  111. package/docs/classes/Env.html +2 -2
  112. package/docs/classes/GlobalNameNotSet.html +3 -3
  113. package/docs/classes/KyselyQueryDriver.html +163 -0
  114. package/docs/classes/NonLoadedAssociation.html +3 -3
  115. package/docs/classes/NotNullViolation.html +3 -3
  116. package/docs/classes/ObjectSerializerBuilder.html +8 -8
  117. package/docs/classes/PostgresQueryDriver.html +165 -0
  118. package/docs/classes/Query.html +59 -87
  119. package/docs/classes/QueryDriverBase.html +156 -0
  120. package/docs/classes/Range.html +2 -2
  121. package/docs/classes/RecordNotFound.html +3 -3
  122. package/docs/classes/ValidationError.html +3 -3
  123. package/docs/functions/DreamSerializer.html +1 -1
  124. package/docs/functions/ObjectSerializer.html +1 -1
  125. package/docs/functions/ReplicaSafe.html +1 -1
  126. package/docs/functions/STI.html +1 -1
  127. package/docs/functions/SoftDelete.html +1 -1
  128. package/docs/functions/camelize.html +1 -1
  129. package/docs/functions/capitalize.html +1 -1
  130. package/docs/functions/cloneDeepSafe.html +1 -1
  131. package/docs/functions/closeAllDbConnections.html +1 -1
  132. package/docs/functions/compact.html +1 -1
  133. package/docs/functions/dreamDbConnections.html +1 -1
  134. package/docs/functions/dreamPath.html +1 -1
  135. package/docs/functions/expandStiClasses.html +1 -1
  136. package/docs/functions/generateDream.html +1 -1
  137. package/docs/functions/globalClassNameFromFullyQualifiedModelName.html +1 -1
  138. package/docs/functions/groupBy.html +1 -1
  139. package/docs/functions/hyphenize.html +1 -1
  140. package/docs/functions/inferSerializerFromDreamOrViewModel.html +1 -1
  141. package/docs/functions/inferSerializersFromDreamClassOrViewModelClass.html +1 -1
  142. package/docs/functions/intersection.html +1 -1
  143. package/docs/functions/isDreamSerializer.html +1 -1
  144. package/docs/functions/isEmpty.html +1 -1
  145. package/docs/functions/loadRepl.html +1 -1
  146. package/docs/functions/lookupClassByGlobalName.html +1 -1
  147. package/docs/functions/normalizeUnicode.html +1 -1
  148. package/docs/functions/pascalize.html +1 -1
  149. package/docs/functions/pgErrorType.html +1 -1
  150. package/docs/functions/range-1.html +1 -1
  151. package/docs/functions/relativeDreamPath.html +1 -1
  152. package/docs/functions/round.html +1 -1
  153. package/docs/functions/serializerNameFromFullyQualifiedModelName.html +1 -1
  154. package/docs/functions/sharedPathPrefix.html +1 -1
  155. package/docs/functions/snakeify.html +1 -1
  156. package/docs/functions/sort.html +1 -1
  157. package/docs/functions/sortBy.html +1 -1
  158. package/docs/functions/sortObjectByKey.html +1 -1
  159. package/docs/functions/sortObjectByValue.html +1 -1
  160. package/docs/functions/standardizeFullyQualifiedModelName.html +1 -1
  161. package/docs/functions/uncapitalize.html +1 -1
  162. package/docs/functions/uniq.html +1 -1
  163. package/docs/functions/untypedDb.html +1 -1
  164. package/docs/functions/validateColumn.html +1 -1
  165. package/docs/functions/validateTable.html +1 -1
  166. package/docs/hierarchy.html +1 -0
  167. package/docs/interfaces/BelongsToStatement.html +2 -2
  168. package/docs/interfaces/DecoratorContext.html +2 -2
  169. package/docs/interfaces/DreamAppInitOptions.html +2 -2
  170. package/docs/interfaces/DreamAppOpts.html +2 -2
  171. package/docs/interfaces/EncryptOptions.html +2 -2
  172. package/docs/interfaces/InternalAnyTypedSerializerRendersMany.html +2 -2
  173. package/docs/interfaces/InternalAnyTypedSerializerRendersOne.html +2 -2
  174. package/docs/interfaces/OpenapiDescription.html +2 -2
  175. package/docs/interfaces/OpenapiSchemaProperties.html +1 -1
  176. package/docs/interfaces/OpenapiSchemaPropertiesShorthand.html +1 -1
  177. package/docs/interfaces/OpenapiTypeFieldObject.html +1 -1
  178. package/docs/interfaces/SerializerRendererOpts.html +2 -2
  179. package/docs/modules.html +3 -0
  180. package/docs/types/Camelized.html +1 -1
  181. package/docs/types/CommonOpenapiSchemaObjectFields.html +1 -1
  182. package/docs/types/DateTime.html +1 -1
  183. package/docs/types/DbConnectionType.html +1 -1
  184. package/docs/types/DbTypes.html +1 -1
  185. package/docs/types/DreamAppAllowedPackageManagersEnum.html +1 -1
  186. package/docs/types/DreamAssociationMetadata.html +1 -1
  187. package/docs/types/DreamAttributes.html +1 -1
  188. package/docs/types/DreamClassAssociationAndStatement.html +1 -1
  189. package/docs/types/DreamClassColumn.html +1 -1
  190. package/docs/types/DreamColumn.html +1 -1
  191. package/docs/types/DreamColumnNames.html +1 -1
  192. package/docs/types/DreamLogLevel.html +1 -1
  193. package/docs/types/DreamLogger.html +1 -1
  194. package/docs/types/DreamModelSerializerType.html +1 -1
  195. package/docs/types/DreamOrViewModelClassSerializerKey.html +1 -1
  196. package/docs/types/DreamOrViewModelSerializerKey.html +1 -1
  197. package/docs/types/DreamParamSafeAttributes.html +1 -1
  198. package/docs/types/DreamParamSafeColumnNames.html +1 -1
  199. package/docs/types/DreamSerializable.html +1 -1
  200. package/docs/types/DreamSerializableArray.html +1 -1
  201. package/docs/types/DreamSerializerKey.html +1 -1
  202. package/docs/types/DreamSerializers.html +1 -1
  203. package/docs/types/DreamVirtualColumns.html +1 -1
  204. package/docs/types/EncryptAlgorithm.html +1 -1
  205. package/docs/types/HasManyStatement.html +1 -1
  206. package/docs/types/HasOneStatement.html +1 -1
  207. package/docs/types/Hyphenized.html +1 -1
  208. package/docs/types/OpenapiAllTypes.html +1 -1
  209. package/docs/types/OpenapiFormats.html +1 -1
  210. package/docs/types/OpenapiNumberFormats.html +1 -1
  211. package/docs/types/OpenapiPrimitiveBaseTypes.html +1 -1
  212. package/docs/types/OpenapiPrimitiveTypes.html +1 -1
  213. package/docs/types/OpenapiSchemaArray.html +1 -1
  214. package/docs/types/OpenapiSchemaArrayShorthand.html +1 -1
  215. package/docs/types/OpenapiSchemaBase.html +1 -1
  216. package/docs/types/OpenapiSchemaBody.html +1 -1
  217. package/docs/types/OpenapiSchemaBodyShorthand.html +1 -1
  218. package/docs/types/OpenapiSchemaCommonFields.html +1 -1
  219. package/docs/types/OpenapiSchemaExpressionAllOf.html +1 -1
  220. package/docs/types/OpenapiSchemaExpressionAnyOf.html +1 -1
  221. package/docs/types/OpenapiSchemaExpressionOneOf.html +1 -1
  222. package/docs/types/OpenapiSchemaExpressionRef.html +1 -1
  223. package/docs/types/OpenapiSchemaExpressionRefSchemaShorthand.html +1 -1
  224. package/docs/types/OpenapiSchemaInteger.html +1 -1
  225. package/docs/types/OpenapiSchemaNull.html +1 -1
  226. package/docs/types/OpenapiSchemaNumber.html +1 -1
  227. package/docs/types/OpenapiSchemaObject.html +1 -1
  228. package/docs/types/OpenapiSchemaObjectAllOf.html +1 -1
  229. package/docs/types/OpenapiSchemaObjectAllOfShorthand.html +1 -1
  230. package/docs/types/OpenapiSchemaObjectAnyOf.html +1 -1
  231. package/docs/types/OpenapiSchemaObjectAnyOfShorthand.html +1 -1
  232. package/docs/types/OpenapiSchemaObjectBase.html +1 -1
  233. package/docs/types/OpenapiSchemaObjectBaseShorthand.html +1 -1
  234. package/docs/types/OpenapiSchemaObjectOneOf.html +1 -1
  235. package/docs/types/OpenapiSchemaObjectOneOfShorthand.html +1 -1
  236. package/docs/types/OpenapiSchemaObjectShorthand.html +1 -1
  237. package/docs/types/OpenapiSchemaPrimitiveGeneric.html +1 -1
  238. package/docs/types/OpenapiSchemaShorthandExpressionAllOf.html +1 -1
  239. package/docs/types/OpenapiSchemaShorthandExpressionAnyOf.html +1 -1
  240. package/docs/types/OpenapiSchemaShorthandExpressionOneOf.html +1 -1
  241. package/docs/types/OpenapiSchemaShorthandExpressionSerializableRef.html +1 -1
  242. package/docs/types/OpenapiSchemaShorthandExpressionSerializerRef.html +1 -1
  243. package/docs/types/OpenapiSchemaShorthandPrimitiveGeneric.html +1 -1
  244. package/docs/types/OpenapiSchemaString.html +1 -1
  245. package/docs/types/OpenapiShorthandAllTypes.html +1 -1
  246. package/docs/types/OpenapiShorthandPrimitiveBaseTypes.html +1 -1
  247. package/docs/types/OpenapiShorthandPrimitiveTypes.html +1 -1
  248. package/docs/types/OpenapiTypeField.html +1 -1
  249. package/docs/types/Pascalized.html +1 -1
  250. package/docs/types/RoundingPrecision.html +1 -1
  251. package/docs/types/SerializerCasing.html +1 -1
  252. package/docs/types/SimpleObjectSerializerType.html +1 -1
  253. package/docs/types/Snakeified.html +1 -1
  254. package/docs/types/UpdateableAssociationProperties.html +1 -1
  255. package/docs/types/UpdateableProperties.html +1 -1
  256. package/docs/types/ValidationType.html +1 -1
  257. package/docs/types/ViewModel.html +1 -1
  258. package/docs/types/ViewModelClass.html +1 -1
  259. package/docs/types/WhereStatementForDream.html +1 -1
  260. package/docs/types/WhereStatementForDreamClass.html +1 -1
  261. package/docs/variables/DateTime-1.html +1 -1
  262. package/docs/variables/DreamAppAllowedPackageManagersEnumValues.html +1 -1
  263. package/docs/variables/DreamConst.html +1 -1
  264. package/docs/variables/TRIGRAM_OPERATORS.html +1 -1
  265. package/docs/variables/openapiPrimitiveTypes-1.html +1 -1
  266. package/docs/variables/openapiShorthandPrimitiveTypes-1.html +1 -1
  267. package/docs/variables/ops.html +1 -1
  268. package/docs/variables/primaryKeyTypes.html +1 -1
  269. package/package.json +4 -3
  270. package/CHANGELOG.md +0 -100
  271. package/dist/cjs/src/helpers/db/truncateDb.js +0 -27
  272. package/dist/esm/src/helpers/db/truncateDb.js +0 -24
  273. package/dist/types/src/bin/helpers/sync.d.ts +0 -1
  274. package/dist/types/src/helpers/db/createDb.d.ts +0 -2
  275. package/dist/types/src/helpers/db/dropDb.d.ts +0 -2
  276. package/dist/types/src/helpers/db/foreignKeyTypeFromPrimaryKey.d.ts +0 -2
  277. package/dist/types/src/helpers/db/loadPgClient.d.ts +0 -4
  278. package/dist/types/src/helpers/db/runMigration.d.ts +0 -6
  279. package/dist/types/src/helpers/db/truncateDb.d.ts +0 -1
  280. /package/dist/cjs/src/{helpers/db → dream/QueryDriver/helpers/kysely}/foreignKeyTypeFromPrimaryKey.js +0 -0
  281. /package/dist/esm/src/{helpers/db → dream/QueryDriver/helpers/kysely}/foreignKeyTypeFromPrimaryKey.js +0 -0
@@ -1,11 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ // after building for esm, importing pg using the following:
4
+ //
5
+ // import * as pg from 'pg'
6
+ //
7
+ // will crash. This is difficult to discover, since it only happens
8
+ // when being imported from our esm build.
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-ignore
11
+ const pg_1 = require("pg");
3
12
  const kysely_1 = require("kysely");
4
13
  const pluralize_esm_1 = require("pluralize-esm");
5
- const sync_js_1 = require("../../bin/helpers/sync.js");
6
14
  const CliFileWriter_js_1 = require("../../cli/CliFileWriter.js");
7
15
  const index_js_1 = require("../../cli/index.js");
8
16
  const errors_js_1 = require("../../db/errors.js");
17
+ const syncDbTypesFiles_js_1 = require("../../db/helpers/syncDbTypesFiles.js");
9
18
  const index_js_2 = require("../../db/index.js");
10
19
  const associationToGetterSetterProp_js_1 = require("../../decorators/field/association/associationToGetterSetterProp.js");
11
20
  const PackageManager_js_1 = require("../../dream-app/helpers/PackageManager.js");
@@ -30,16 +39,13 @@ const generateMigration_js_1 = require("../../helpers/cli/generateMigration.js")
30
39
  const SchemaBuilder_js_1 = require("../../helpers/cli/SchemaBuilder.js");
31
40
  const compact_js_1 = require("../../helpers/compact.js");
32
41
  const DateTime_js_1 = require("../../helpers/DateTime.js");
33
- const createDb_js_1 = require("../../helpers/db/createDb.js");
34
- const dropDb_js_1 = require("../../helpers/db/dropDb.js");
35
- const loadPgClient_js_1 = require("../../helpers/db/loadPgClient.js");
36
- const runMigration_js_1 = require("../../helpers/db/runMigration.js");
37
42
  const EnvInternal_js_1 = require("../../helpers/EnvInternal.js");
38
43
  const groupBy_js_1 = require("../../helpers/groupBy.js");
39
44
  const isEmpty_js_1 = require("../../helpers/isEmpty.js");
40
45
  const namespaceColumn_js_1 = require("../../helpers/namespaceColumn.js");
41
46
  const normalizeUnicode_js_1 = require("../../helpers/normalizeUnicode.js");
42
47
  const objectPathsToArrays_js_1 = require("../../helpers/objectPathsToArrays.js");
48
+ const pascalize_js_1 = require("../../helpers/pascalize.js");
43
49
  const protectAgainstPollutingAssignment_js_1 = require("../../helpers/protectAgainstPollutingAssignment.js");
44
50
  const range_js_1 = require("../../helpers/range.js");
45
51
  const snakeify_js_1 = require("../../helpers/snakeify.js");
@@ -48,6 +54,7 @@ const uniq_js_1 = require("../../helpers/uniq.js");
48
54
  const curried_ops_statement_js_1 = require("../../ops/curried-ops-statement.js");
49
55
  const ops_statement_js_1 = require("../../ops/ops-statement.js");
50
56
  const constants_js_1 = require("../constants.js");
57
+ const DreamTransaction_js_1 = require("../DreamTransaction.js");
51
58
  const throughAssociationHasOptionsBesidesThroughAndSource_js_1 = require("../internal/associations/throughAssociationHasOptionsBesidesThroughAndSource.js");
52
59
  const associationStringToNameAndAlias_js_1 = require("../internal/associationStringToNameAndAlias.js");
53
60
  const executeDatabaseQuery_js_1 = require("../internal/executeDatabaseQuery.js");
@@ -57,6 +64,8 @@ const SimilarityBuilder_js_1 = require("../internal/similarity/SimilarityBuilder
57
64
  const sqlResultToDreamInstance_js_1 = require("../internal/sqlResultToDreamInstance.js");
58
65
  const Query_js_1 = require("../Query.js");
59
66
  const Base_js_1 = require("./Base.js");
67
+ const runMigration_js_1 = require("./helpers/kysely/runMigration.js");
68
+ const softDeleteDream_js_1 = require("../internal/softDeleteDream.js");
60
69
  class KyselyQueryDriver extends Base_js_1.default {
61
70
  // ATTENTION FRED
62
71
  // stop trying to make this async. You never learn...
@@ -67,48 +76,101 @@ class KyselyQueryDriver extends Base_js_1.default {
67
76
  // you are attempting to support. By default, dream is postgres-only, so our internal _db
68
77
  // function will return a kysely instance, tightly coupled to a postgres-specific connection.
69
78
  dbFor(sqlCommandType) {
70
- if (this.dreamTransaction?.kyselyTransaction)
71
- return this.dreamTransaction?.kyselyTransaction;
72
- return (0, index_js_2.default)(this.dbConnectionType(sqlCommandType));
79
+ const constructor = this.constructor;
80
+ return constructor.dbFor(this.dreamInstance.connectionName, this.dbConnectionType(sqlCommandType), this.dreamTransaction);
81
+ }
82
+ // if you are attempting to leverage a kysely-based connection using a different driver,
83
+ // you would want to extend this KyselyQueryDriver class, and then change this method
84
+ // to return a custom kysely instance, tailored to the specific database connection
85
+ // you are attempting to support. By default, dream is postgres-only, so our internal _db
86
+ // function will return a kysely instance, tightly coupled to a postgres-specific connection.
87
+ static dbFor(connectionName, dbConnectionType, dreamTransaction) {
88
+ if (dreamTransaction?.kyselyTransaction)
89
+ return dreamTransaction?.kyselyTransaction;
90
+ return (0, index_js_2.default)(connectionName || 'default', dbConnectionType, this.dialectProvider(connectionName, dbConnectionType));
91
+ }
92
+ static dialectProvider(connectionName, dbConnectionType) {
93
+ return (connectionConf) => new kysely_1.PostgresDialect({
94
+ pool: new pg_1.default.Pool({
95
+ user: connectionConf.user || '',
96
+ password: connectionConf.password || '',
97
+ database: index_js_3.default.getOrFail().dbName(connectionName, dbConnectionType),
98
+ host: connectionConf.host || 'localhost',
99
+ port: connectionConf.port || 5432,
100
+ ssl: connectionConf.useSsl ? defaultPostgresSslConfig(connectionConf) : false,
101
+ }),
102
+ });
73
103
  }
74
104
  /**
75
105
  * migrate the database. Must respond to the NODE_ENV value.
76
106
  */
77
- static async migrate() {
107
+ static async migrate(connectionName) {
78
108
  const dreamApp = index_js_3.default.getOrFail();
79
- const primaryDbConf = dreamApp.dbConnectionConfig('primary');
109
+ const primaryDbConf = dreamApp.dbConnectionConfig(connectionName, 'primary');
80
110
  index_js_1.default.logger.logStartProgress(`migrating ${primaryDbConf.name}...`);
81
- await (0, runMigration_js_1.default)({ mode: 'migrate' });
111
+ await (0, runMigration_js_1.default)({
112
+ connectionName,
113
+ mode: 'migrate',
114
+ dialectProvider: this.dialectProvider(connectionName, 'primary'),
115
+ });
82
116
  index_js_1.default.logger.logEndProgress();
83
- await this.duplicateDatabase();
117
+ await this.duplicateDatabase(connectionName);
84
118
  }
85
119
  /**
86
120
  * rollback the database. Must respond to the NODE_ENV value.
87
121
  */
88
122
  static async rollback(opts) {
89
123
  const dreamApp = index_js_3.default.getOrFail();
90
- const primaryDbConf = dreamApp.dbConnectionConfig('primary');
124
+ const primaryDbConf = dreamApp.dbConnectionConfig(opts.connectionName || 'default', 'primary');
91
125
  index_js_1.default.logger.logStartProgress(`rolling back ${primaryDbConf.name}...`);
92
126
  let step = opts.steps;
93
127
  while (step > 0) {
94
- await (0, runMigration_js_1.default)({ mode: 'rollback' });
128
+ await (0, runMigration_js_1.default)({
129
+ connectionName: opts.connectionName,
130
+ mode: 'rollback',
131
+ dialectProvider: this.dialectProvider(opts.connectionName, 'primary'),
132
+ });
95
133
  step -= 1;
96
134
  }
97
135
  index_js_1.default.logger.logEndProgress();
98
- await this.duplicateDatabase();
136
+ await this.duplicateDatabase(opts.connectionName);
99
137
  }
100
- static async generateMigration(migrationName, columnsWithTypes) {
101
- await (0, generateMigration_js_1.default)({ migrationName, columnsWithTypes });
138
+ /**
139
+ * This should build a new migration file in the migrations folder
140
+ * of your application. This will then need to be read and run
141
+ * whenever the `migrate` method is called. The filename should
142
+ * contain a timestamp at the front of the filename, so that it
143
+ * is sorted by date in the file tree, and, more importantly, so
144
+ * they can be run in order by your migration runner.
145
+ */
146
+ static async generateMigration(connectionName, migrationName, columnsWithTypes) {
147
+ await (0, generateMigration_js_1.default)({ migrationName, columnsWithTypes, connectionName });
102
148
  }
103
- static async sync(onSync, options = {}) {
149
+ /**
150
+ * defines the syncing behavior for dream and psychic,
151
+ * which is run whenever the `sync` command is called.
152
+ * This is an important step, and will be incredibly
153
+ * comlpex to override. You will need to do the following
154
+ * when overriding this method:
155
+ *
156
+ * 1. introspect the db and use it to generate a db.ts file in the
157
+ * same shape as the existing one. Currently, the process for generating
158
+ * this file is extremely complex and messy, and will be difficult
159
+ * to achieve.
160
+ * 2. generate a types/dream.ts file in the same shape as the existing
161
+ * one. This is normally done using `await new SchemaBuilder().build()`,
162
+ * but this will likely need to be overridden to tailor to your custom
163
+ * database engine.
164
+ */
165
+ static async sync(connectionName, onSync, options = {}) {
104
166
  try {
105
167
  if (!options?.schemaOnly) {
106
- await index_js_1.default.logger.logProgress('writing db schema...', async () => {
107
- await (0, sync_js_1.default)();
168
+ await index_js_1.default.logger.logProgress(`introspecting db for connection: ${connectionName}...`, async () => {
169
+ await (0, syncDbTypesFiles_js_1.default)(connectionName);
108
170
  });
109
171
  }
110
- const schemaBuilder = new SchemaBuilder_js_1.default();
111
- await index_js_1.default.logger.logProgress('building dream schema...', async () => {
172
+ const schemaBuilder = new SchemaBuilder_js_1.default(connectionName);
173
+ await index_js_1.default.logger.logProgress(`building dream schema for connection ${connectionName}...`, async () => {
112
174
  await schemaBuilder.build();
113
175
  });
114
176
  if (schemaBuilder.hasForeignKeyError && !options?.schemaOnly) {
@@ -125,6 +187,7 @@ class KyselyQueryDriver extends Base_js_1.default {
125
187
  });
126
188
  });
127
189
  }
190
+ await SchemaBuilder_js_1.default.buildGlobalTypes();
128
191
  if (!options?.schemaOnly) {
129
192
  // intentionally leaving logs off here, since it allows other
130
193
  // onSync handlers to determine their own independent logging approach
@@ -138,41 +201,68 @@ class KyselyQueryDriver extends Base_js_1.default {
138
201
  });
139
202
  }
140
203
  }
204
+ static get syncDialect() {
205
+ return 'postgres';
206
+ }
141
207
  /**
142
- * create the database. Must respond to the NODE_ENV value.
208
+ * @internal
209
+ *
210
+ * returns the foreign key type based on the primary key received.
211
+ * gives the driver the opportunity to switch i.e. bigserial to bigint.
143
212
  */
144
- static async dbCreate() {
145
- const dreamApp = index_js_3.default.getOrFail();
146
- const primaryDbConf = dreamApp.dbConnectionConfig('primary');
147
- index_js_1.default.logger.logStartProgress(`creating ${primaryDbConf.name}...`);
148
- await (0, createDb_js_1.default)('primary');
149
- index_js_1.default.logger.logEndProgress();
150
- // TODO: add support for creating replicas. Began doing it below, but it is very tricky,
151
- // and we don't need it at the moment, so kicking off for future development when we have more time
152
- // to flesh this out.
153
- // if (connectionRetriever.hasReplicaConfig()) {
154
- // const replicaDbConf = connectionRetriever.getConnectionConf('replica')
155
- // console.log(`creating ${process.env[replicaDbConf.name]}`)
156
- // await createDb('replica')
157
- // }
213
+ static foreignKeyTypeFromPrimaryKey(primaryKey) {
214
+ switch (primaryKey) {
215
+ case 'bigserial':
216
+ return 'bigint';
217
+ default:
218
+ return primaryKey;
219
+ }
158
220
  }
159
221
  /**
160
- * delete the database. Must respond to the NODE_ENV value.
222
+ * @internal
223
+ *
224
+ * used to return the computed primary key type based
225
+ * on the primaryKeyType set in the DreamApp class.
161
226
  */
162
- static async dbDrop() {
163
- const dreamApp = index_js_3.default.getOrFail();
164
- const primaryDbConf = dreamApp.dbConnectionConfig('primary');
165
- index_js_1.default.logger.logStartProgress(`dropping ${primaryDbConf.name}...`);
166
- await (0, dropDb_js_1.default)('primary');
167
- index_js_1.default.logger.logEndProgress();
168
- // TODO: add support for dropping replicas. Began doing it below, but it is very tricky,
169
- // and we don't need it at the moment, so kicking off for future development when we have more time
170
- // to flesh this out.
171
- // if (connectionRetriever.hasReplicaConfig()) {
172
- // const replicaDbConf = connectionRetriever.getConnectionConf('replica')
173
- // console.log(`dropping ${process.env[replicaDbConf.name]}`)
174
- // await _dropDb('replica')
175
- // }
227
+ static primaryKeyType() {
228
+ const dreamconf = index_js_3.default.getOrFail();
229
+ switch (dreamconf.primaryKeyType) {
230
+ case 'bigint':
231
+ case 'bigserial':
232
+ case 'uuid':
233
+ case 'integer':
234
+ return dreamconf.primaryKeyType;
235
+ default: {
236
+ // protection so that if a new EncryptAlgorithm is ever added, this will throw a type error at build time
237
+ const _never = dreamconf.primaryKeyType;
238
+ throw new Error(`
239
+ ATTENTION!
240
+
241
+ unrecognized primary key type "${_never}" found in .dream.yml.
242
+ please use one of the allowed primary key types:
243
+ ${constants_js_1.primaryKeyTypes.join(', ')}
244
+ `);
245
+ }
246
+ }
247
+ }
248
+ /**
249
+ * destroys a dream, possibly implementing soft delete if reallyDestroy is false
250
+ * and the record being deleted implements soft delete.
251
+ *
252
+ * @param dream - the dream instance you wish to destroy
253
+ * @param txn - a transaction to encapsulate, consistently provided by underlying dream mechanisms
254
+ * @param reallyDestroy - whether or not to reallyDestroy. If false, soft delete will be attempted when relevant
255
+ */
256
+ static async destroyDream(dream, txn, reallyDestroy) {
257
+ if (shouldSoftDelete(dream, reallyDestroy)) {
258
+ await (0, softDeleteDream_js_1.default)(dream, txn);
259
+ }
260
+ else if (!dream['_preventDeletion']) {
261
+ await txn.kyselyTransaction
262
+ .deleteFrom(dream.table)
263
+ .where(dream['_primaryKey'], '=', dream.primaryKeyValue())
264
+ .execute();
265
+ }
176
266
  }
177
267
  /**
178
268
  * Converts the given dream class into a Kysely query, enabling
@@ -202,6 +292,41 @@ class KyselyQueryDriver extends Base_js_1.default {
202
292
  }
203
293
  }
204
294
  }
295
+ /**
296
+ * Builds a new DreamTransaction instance, provides
297
+ * the instance to the provided callback.
298
+ *
299
+ * ```ts
300
+ * await ApplicationModel.transaction(async txn => {
301
+ * const user = await User.txn(txn).create({ email: 'how@yadoin' })
302
+ * await Pet.txn(txn).create({ user })
303
+ * })
304
+ * ```
305
+ *
306
+ * @param callback - A callback function to call. The transaction provided to the callback can be passed to subsequent database calls within the transaction callback
307
+ * @returns void
308
+ */
309
+ static async transaction(dreamInstance, callback) {
310
+ const dreamTransaction = new DreamTransaction_js_1.default();
311
+ let callbackResponse = undefined;
312
+ await this.dbFor(dreamInstance.connectionName || 'default', 'primary')
313
+ .transaction()
314
+ .execute(async (kyselyTransaction) => {
315
+ dreamTransaction.kyselyTransaction = kyselyTransaction;
316
+ callbackResponse = (await callback(dreamTransaction));
317
+ });
318
+ await dreamTransaction.runAfterCommitHooks(dreamTransaction);
319
+ return callbackResponse;
320
+ }
321
+ /**
322
+ * @internal
323
+ *
324
+ * this is used by getColumnData to serialize enums
325
+ */
326
+ static enumType(row) {
327
+ const enumName = (0, pascalize_js_1.default)(row.udtName.replace(/\[\]$/, ''));
328
+ return enumName;
329
+ }
205
330
  /**
206
331
  * @internal
207
332
  *
@@ -246,7 +371,7 @@ class KyselyQueryDriver extends Base_js_1.default {
246
371
  const driverClass = this.constructor;
247
372
  return (await new driverClass(query)['executeJoinLoad']())[0] || null;
248
373
  }
249
- const kyselyQuery = new KyselyQueryDriver(this.query.limit(1)).buildSelect();
374
+ const kyselyQuery = new this.constructor(this.query.limit(1)).buildSelect();
250
375
  const results = await (0, executeDatabaseQuery_js_1.default)(kyselyQuery, 'executeTakeFirst');
251
376
  if (results) {
252
377
  const theFirst = this.dbResultToDreamInstance(results, this.dreamClass);
@@ -295,7 +420,7 @@ class KyselyQueryDriver extends Base_js_1.default {
295
420
  async max(columnName) {
296
421
  // eslint-disable-next-line @typescript-eslint/unbound-method
297
422
  const { max } = this.dbFor('select').fn;
298
- let kyselyQuery = new KyselyQueryDriver(this.query).buildSelect({
423
+ let kyselyQuery = new this.constructor(this.query).buildSelect({
299
424
  bypassSelectAll: true,
300
425
  bypassOrder: true,
301
426
  });
@@ -318,7 +443,7 @@ class KyselyQueryDriver extends Base_js_1.default {
318
443
  async min(columnName) {
319
444
  // eslint-disable-next-line @typescript-eslint/unbound-method
320
445
  const { min } = this.dbFor('select').fn;
321
- let kyselyQuery = new KyselyQueryDriver(this.query).buildSelect({
446
+ let kyselyQuery = new this.constructor(this.query).buildSelect({
322
447
  bypassSelectAll: true,
323
448
  bypassOrder: true,
324
449
  });
@@ -340,7 +465,10 @@ class KyselyQueryDriver extends Base_js_1.default {
340
465
  const { count } = this.dbFor('select').fn;
341
466
  const distinctColumn = this.query['distinctColumn'];
342
467
  const query = this.query.clone({ distinctColumn: null });
343
- let kyselyQuery = new KyselyQueryDriver(query).buildSelect({ bypassSelectAll: true, bypassOrder: true });
468
+ let kyselyQuery = new this.constructor(query).buildSelect({
469
+ bypassSelectAll: true,
470
+ bypassOrder: true,
471
+ });
344
472
  const countClause = distinctColumn
345
473
  ? count((0, kysely_1.sql) `DISTINCT ${distinctColumn}`)
346
474
  : count(query['namespaceColumn'](query.dreamInstance['_primaryKey']));
@@ -356,7 +484,7 @@ class KyselyQueryDriver extends Base_js_1.default {
356
484
  * @returns An array of plucked values
357
485
  */
358
486
  async pluck(...fields) {
359
- let kyselyQuery = new KyselyQueryDriver(this.query['removeAllDefaultScopesExceptOnAssociations']()).buildSelect({
487
+ let kyselyQuery = new this.constructor(this.query['removeAllDefaultScopesExceptOnAssociations']()).buildSelect({
360
488
  bypassSelectAll: true,
361
489
  });
362
490
  const aliases = [];
@@ -418,7 +546,8 @@ class KyselyQueryDriver extends Base_js_1.default {
418
546
  * subsequent model hooks that are fired.
419
547
  */
420
548
  static async saveDream(dream, txn = null) {
421
- const db = txn?.kyselyTransaction ?? (0, index_js_2.default)('primary');
549
+ const connectionName = dream.connectionName || 'default';
550
+ const db = txn?.kyselyTransaction ?? this.dbFor(connectionName, 'primary');
422
551
  const sqlifiedAttributes = (0, sqlAttributes_js_1.default)(dream);
423
552
  try {
424
553
  if (dream.isPersisted) {
@@ -509,7 +638,7 @@ class KyselyQueryDriver extends Base_js_1.default {
509
638
  buildDelete() {
510
639
  const kyselyQuery = this.dbFor('delete').deleteFrom(this.query['baseSqlAlias']);
511
640
  const results = this.attachLimitAndOrderStatementsToNonSelectQuery(kyselyQuery);
512
- return new KyselyQueryDriver(results.clone).buildCommon(results.kyselyQuery);
641
+ return new this.constructor(results.clone).buildCommon(results.kyselyQuery);
513
642
  }
514
643
  buildSelect({ bypassSelectAll = false, bypassOrder = false, columns, } = {}) {
515
644
  let kyselyQuery;
@@ -518,7 +647,9 @@ class KyselyQueryDriver extends Base_js_1.default {
518
647
  const query = connectionOverride
519
648
  ? this.query['baseSelectQuery'].connection(connectionOverride)
520
649
  : this.query['baseSelectQuery'];
521
- kyselyQuery = new KyselyQueryDriver(query).buildSelect({ bypassSelectAll: true });
650
+ kyselyQuery = new this.constructor(query).buildSelect({
651
+ bypassSelectAll: true,
652
+ });
522
653
  }
523
654
  else {
524
655
  const from = this.query['baseSqlAlias'] === this.query['tableName']
@@ -535,7 +666,7 @@ class KyselyQueryDriver extends Base_js_1.default {
535
666
  });
536
667
  if (this.query['orderStatements'].length && !bypassOrder) {
537
668
  this.query['orderStatements'].forEach(orderStatement => {
538
- kyselyQuery = kyselyQuery.orderBy(this.namespaceColumn(orderStatement.column), (0, orderByDirection_js_1.default)(orderStatement.direction));
669
+ kyselyQuery = kyselyQuery.orderBy(this.namespaceColumn(orderStatement.column), this.orderByDirection(orderStatement.direction));
539
670
  });
540
671
  }
541
672
  if (this.query['limitStatement'])
@@ -555,13 +686,16 @@ class KyselyQueryDriver extends Base_js_1.default {
555
686
  kyselyQuery = kyselyQuery.clearOrderBy();
556
687
  return kyselyQuery;
557
688
  }
689
+ orderByDirection(direction) {
690
+ return (0, orderByDirection_js_1.default)(direction);
691
+ }
558
692
  buildUpdate(attributes) {
559
693
  let kyselyQuery = this.dbFor('update')
560
694
  .updateTable(this.query['tableName'])
561
695
  .set(attributes);
562
696
  kyselyQuery = this.conditionallyAttachSimilarityColumnsToUpdate(kyselyQuery);
563
697
  const results = this.attachLimitAndOrderStatementsToNonSelectQuery(kyselyQuery);
564
- return new KyselyQueryDriver(results.clone).buildCommon(results.kyselyQuery);
698
+ return new this.constructor(results.clone).buildCommon(results.kyselyQuery);
565
699
  }
566
700
  /**
567
701
  * @internal
@@ -612,29 +746,6 @@ class KyselyQueryDriver extends Base_js_1.default {
612
746
  async hydratePreload(dream) {
613
747
  await this.applyPreload(this.query['preloadStatements'], this.query['preloadOnStatements'], dream);
614
748
  }
615
- static async duplicateDatabase() {
616
- const dreamApp = index_js_3.default.getOrFail();
617
- const parallelTests = dreamApp.parallelTests;
618
- if (!parallelTests)
619
- return;
620
- index_js_1.default.logger.logStartProgress(`duplicating db for parallel tests...`);
621
- const dbConf = dreamApp.dbConnectionConfig('primary');
622
- const client = await (0, loadPgClient_js_1.default)({ useSystemDb: true });
623
- if (EnvInternal_js_1.default.boolean('DREAM_CORE_DEVELOPMENT')) {
624
- const replicaTestWorkerDatabaseName = `replica_test_${dbConf.name}`;
625
- index_js_1.default.logger.logContinueProgress(`creating fake replica test database ${replicaTestWorkerDatabaseName}...`, { logPrefix: ' ├ [db]', logPrefixColor: 'cyan' });
626
- await client.query(`DROP DATABASE IF EXISTS ${replicaTestWorkerDatabaseName};`);
627
- await client.query(`CREATE DATABASE ${replicaTestWorkerDatabaseName} TEMPLATE ${dbConf.name};`);
628
- }
629
- for (let i = 2; i <= parallelTests; i++) {
630
- const workerDatabaseName = `${dbConf.name}_${i}`;
631
- index_js_1.default.logger.logContinueProgress(`creating duplicate test database ${workerDatabaseName} for concurrent tests...`, { logPrefix: ' ├ [db]', logPrefixColor: 'cyan' });
632
- await client.query(`DROP DATABASE IF EXISTS ${workerDatabaseName};`);
633
- await client.query(`CREATE DATABASE ${workerDatabaseName} TEMPLATE ${dbConf.name};`);
634
- }
635
- await client.end();
636
- index_js_1.default.logger.logEndProgress();
637
- }
638
749
  aliasWhereStatements(whereStatements, alias) {
639
750
  return whereStatements.map(whereStatement => this.aliasWhereStatement(whereStatement, alias));
640
751
  }
@@ -682,7 +793,9 @@ class KyselyQueryDriver extends Base_js_1.default {
682
793
  */
683
794
  async executeJoinLoad(options = {}) {
684
795
  const query = this.query['limit'](null).offset(null);
685
- let kyselyQuery = new KyselyQueryDriver(query).buildSelect({ bypassSelectAll: true });
796
+ let kyselyQuery = new this.constructor(query).buildSelect({
797
+ bypassSelectAll: true,
798
+ });
686
799
  const aliasToDreamClassesMap = {
687
800
  [this.query['baseSqlAlias']]: this.dreamClass,
688
801
  ...this.joinStatementsToDreamClassesMap(this.query['leftJoinStatements']),
@@ -1867,3 +1980,17 @@ const associationStringToAssociationAndMaybeAlias = function ({ dreamClass, asso
1867
1980
  alias,
1868
1981
  };
1869
1982
  };
1983
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1984
+ function defaultPostgresSslConfig(connectionConf) {
1985
+ // TODO: properly configure (https://rvohealth.atlassian.net/browse/PDTC-2914)
1986
+ return {
1987
+ rejectUnauthorized: false,
1988
+ // ca: fs.readFileSync('/path/to/server-certificates/root.crt').toString(),
1989
+ // key: fs.readFileSync('/path/to/client-key/postgresql.key').toString(),
1990
+ // cert: fs.readFileSync('/path/to/client-certificates/postgresql.crt').toString(),
1991
+ };
1992
+ }
1993
+ function shouldSoftDelete(dream, reallyDestroy) {
1994
+ const dreamClass = dream.constructor;
1995
+ return dreamClass['softDelete'] && !reallyDestroy;
1996
+ }
@@ -1,6 +1,168 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ // after building for esm, importing pg using the following:
4
+ //
5
+ // import * as pg from 'pg'
6
+ //
7
+ // will crash. This is difficult to discover, since it only happens
8
+ // when being imported from our esm build.
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-ignore
11
+ const pg_1 = require("pg");
12
+ const kysely_1 = require("kysely");
13
+ const index_js_1 = require("../../cli/index.js");
14
+ const dataTypes_js_1 = require("../../db/dataTypes.js");
15
+ const index_js_2 = require("../../dream-app/index.js");
16
+ const camelize_js_1 = require("../../helpers/camelize.js");
17
+ const customPgParsers_js_1 = require("../../helpers/customPgParsers.js");
18
+ const EnvInternal_js_1 = require("../../helpers/EnvInternal.js");
19
+ const createDb_js_1 = require("./helpers/pg/createDb.js");
20
+ const dropDb_js_1 = require("./helpers/pg/dropDb.js");
21
+ const loadPgClient_js_1 = require("./helpers/pg/loadPgClient.js");
3
22
  const Kysely_js_1 = require("./Kysely.js");
23
+ const pgTypes = pg_1.default.types;
4
24
  class PostgresQueryDriver extends Kysely_js_1.default {
25
+ /**
26
+ * create the database. Must respond to the NODE_ENV value.
27
+ */
28
+ static async dbCreate(connectionName) {
29
+ const dreamApp = index_js_2.default.getOrFail();
30
+ const primaryDbConf = dreamApp.dbConnectionConfig(connectionName, 'primary');
31
+ index_js_1.default.logger.logStartProgress(`creating ${primaryDbConf.name}...`);
32
+ await (0, createDb_js_1.default)(connectionName, 'primary');
33
+ index_js_1.default.logger.logEndProgress();
34
+ // TODO: add support for creating replicas. Began doing it below, but it is very tricky,
35
+ // and we don't need it at the moment, so kicking off for future development when we have more time
36
+ // to flesh this out.
37
+ // if (connectionRetriever.hasReplicaConfig(connectionName)) {
38
+ // const replicaDbConf = connectionRetriever.getConnectionConf('replica')
39
+ // console.log(`creating ${process.env[replicaDbConf.name]}`)
40
+ // await createDb('replica')
41
+ // }
42
+ }
43
+ /**
44
+ * delete the database. Must respond to the NODE_ENV value.
45
+ */
46
+ static async dbDrop(connectionName) {
47
+ const dreamApp = index_js_2.default.getOrFail();
48
+ const primaryDbConf = dreamApp.dbConnectionConfig(connectionName, 'primary');
49
+ index_js_1.default.logger.logStartProgress(`dropping ${primaryDbConf.name}...`);
50
+ await (0, dropDb_js_1.default)(connectionName, 'primary');
51
+ index_js_1.default.logger.logEndProgress();
52
+ // TODO: add support for dropping replicas. Began doing it below, but it is very tricky,
53
+ // and we don't need it at the moment, so kicking off for future development when we have more time
54
+ // to flesh this out.
55
+ // if (connectionRetriever.hasReplicaConfig(connectionName)) {
56
+ // const replicaDbConf = connectionRetriever.getConnectionConf('replica')
57
+ // console.log(`dropping ${process.env[replicaDbConf.name]}`)
58
+ // await _dropDb('replica')
59
+ // }
60
+ }
61
+ /**
62
+ * @internal
63
+ *
64
+ * this method is called when dream is initializing, and is used
65
+ * to configure the database to utilize custom type parsers for
66
+ * a variety of data types.
67
+ *
68
+ * @param connectionName - the name of the connection you are doing this for
69
+ * @returns void
70
+ */
71
+ static async setDatabaseTypeParsers(connectionName) {
72
+ const kyselyDb = this.dbFor(connectionName, 'primary');
73
+ pgTypes.setTypeParser(pgTypes.builtins.DATE, customPgParsers_js_1.parsePostgresDate);
74
+ pgTypes.setTypeParser(pgTypes.builtins.TIMESTAMP, customPgParsers_js_1.parsePostgresDatetime);
75
+ pgTypes.setTypeParser(pgTypes.builtins.TIMESTAMPTZ, customPgParsers_js_1.parsePostgresDatetime);
76
+ pgTypes.setTypeParser(pgTypes.builtins.NUMERIC, customPgParsers_js_1.parsePostgresDecimal);
77
+ pgTypes.setTypeParser(pgTypes.builtins.INT8, customPgParsers_js_1.parsePostgresBigint);
78
+ const textArrayOid = await (0, customPgParsers_js_1.findCorrespondingArrayOid)(kyselyDb, pgTypes.builtins.TEXT);
79
+ if (textArrayOid) {
80
+ let oid;
81
+ const textArrayParser = pgTypes.getTypeParser(textArrayOid);
82
+ function transformPostgresArray(transformer) {
83
+ return (value) => textArrayParser(value).map(str => transformer(str));
84
+ }
85
+ const enumArrayOids = await (0, customPgParsers_js_1.findEnumArrayOids)(kyselyDb);
86
+ enumArrayOids.forEach((enumArrayOid) => pgTypes.setTypeParser(enumArrayOid, textArrayParser));
87
+ oid = await (0, customPgParsers_js_1.findCitextArrayOid)(kyselyDb);
88
+ if (oid)
89
+ pgTypes.setTypeParser(oid, textArrayParser);
90
+ oid = await (0, customPgParsers_js_1.findCorrespondingArrayOid)(kyselyDb, pgTypes.builtins.UUID);
91
+ if (oid)
92
+ pgTypes.setTypeParser(oid, textArrayParser);
93
+ oid = await (0, customPgParsers_js_1.findCorrespondingArrayOid)(kyselyDb, pgTypes.builtins.DATE);
94
+ if (oid)
95
+ pgTypes.setTypeParser(oid, transformPostgresArray(customPgParsers_js_1.parsePostgresDate));
96
+ oid = await (0, customPgParsers_js_1.findCorrespondingArrayOid)(kyselyDb, pgTypes.builtins.TIMESTAMP);
97
+ if (oid)
98
+ pgTypes.setTypeParser(oid, transformPostgresArray(customPgParsers_js_1.parsePostgresDatetime));
99
+ oid = await (0, customPgParsers_js_1.findCorrespondingArrayOid)(kyselyDb, pgTypes.builtins.TIMESTAMPTZ);
100
+ if (oid)
101
+ pgTypes.setTypeParser(oid, transformPostgresArray(customPgParsers_js_1.parsePostgresDatetime));
102
+ oid = await (0, customPgParsers_js_1.findCorrespondingArrayOid)(kyselyDb, pgTypes.builtins.NUMERIC);
103
+ if (oid)
104
+ pgTypes.setTypeParser(oid, transformPostgresArray(customPgParsers_js_1.parsePostgresDecimal));
105
+ oid = await (0, customPgParsers_js_1.findCorrespondingArrayOid)(kyselyDb, pgTypes.builtins.INT8);
106
+ if (oid)
107
+ pgTypes.setTypeParser(oid, transformPostgresArray(customPgParsers_js_1.parsePostgresBigint));
108
+ }
109
+ }
110
+ /**
111
+ * @internal
112
+ *
113
+ * this is used by the SchemaBuilder to store column data permanently
114
+ * within the types/dream.ts file.
115
+ */
116
+ static async getColumnData(connectionName, tableName, associationData) {
117
+ const db = this.dbFor(connectionName, 'primary');
118
+ const sqlQuery = (0, kysely_1.sql) `SELECT column_name, udt_name::regtype, is_nullable, data_type FROM information_schema.columns WHERE table_name = ${tableName}`;
119
+ const columnToDBTypeMap = await sqlQuery.execute(db);
120
+ const rows = columnToDBTypeMap.rows;
121
+ const columnData = {};
122
+ rows.forEach(row => {
123
+ const isEnum = ['USER-DEFINED', 'ARRAY'].includes(row.dataType) && !(0, dataTypes_js_1.isPrimitiveDataType)(row.udtName);
124
+ const isArray = ['ARRAY'].includes(row.dataType);
125
+ const associationMetadata = associationData[row.columnName];
126
+ columnData[(0, camelize_js_1.default)(row.columnName)] = {
127
+ dbType: row.udtName,
128
+ allowNull: row.isNullable === 'YES',
129
+ enumType: isEnum ? this.enumType(row) : null,
130
+ enumValues: isEnum ? `${this.enumType(row)}Values` : null,
131
+ isArray,
132
+ foreignKey: associationMetadata?.foreignKey || null,
133
+ };
134
+ });
135
+ return Object.keys(columnData)
136
+ .sort()
137
+ .reduce((acc, key) => {
138
+ if (columnData[key] === undefined)
139
+ return acc;
140
+ acc[key] = columnData[key];
141
+ return acc;
142
+ }, {});
143
+ }
144
+ static async duplicateDatabase(connectionName) {
145
+ const dreamApp = index_js_2.default.getOrFail();
146
+ const parallelTests = dreamApp.parallelTests;
147
+ if (!parallelTests)
148
+ return;
149
+ index_js_1.default.logger.logStartProgress(`duplicating db for parallel tests...`);
150
+ const dbConf = dreamApp.dbConnectionConfig(connectionName, 'primary');
151
+ const client = await (0, loadPgClient_js_1.default)({ useSystemDb: true, connectionName });
152
+ if (EnvInternal_js_1.default.boolean('DREAM_CORE_DEVELOPMENT')) {
153
+ const replicaTestWorkerDatabaseName = `replica_test_${dbConf.name}`;
154
+ index_js_1.default.logger.logContinueProgress(`creating fake replica test database ${replicaTestWorkerDatabaseName}...`, { logPrefix: ' ├ [db]', logPrefixColor: 'cyan' });
155
+ await client.query(`DROP DATABASE IF EXISTS ${replicaTestWorkerDatabaseName};`);
156
+ await client.query(`CREATE DATABASE ${replicaTestWorkerDatabaseName} TEMPLATE ${dbConf.name};`);
157
+ }
158
+ for (let i = 2; i <= parallelTests; i++) {
159
+ const workerDatabaseName = `${dbConf.name}_${i}`;
160
+ index_js_1.default.logger.logContinueProgress(`creating duplicate test database ${workerDatabaseName} for concurrent tests...`, { logPrefix: ' ├ [db]', logPrefixColor: 'cyan' });
161
+ await client.query(`DROP DATABASE IF EXISTS ${workerDatabaseName};`);
162
+ await client.query(`CREATE DATABASE ${workerDatabaseName} TEMPLATE ${dbConf.name};`);
163
+ }
164
+ await client.end();
165
+ index_js_1.default.logger.logEndProgress();
166
+ }
5
167
  }
6
168
  exports.default = PostgresQueryDriver;