@deterministic-code/datasources 0.1.1 → 0.1.3

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 (613) hide show
  1. package/dist/ArrayReader.js +27 -0
  2. package/dist/BatchCommandIBulkWriteStrategy.js +150 -0
  3. package/dist/BuiltRepository.js +1 -0
  4. package/dist/BulkCRUDRepository.js +48 -0
  5. package/dist/BulkCommand.js +1 -0
  6. package/dist/BulkWriteEnrichment.js +11 -0
  7. package/dist/CRUDRepository.js +182 -0
  8. package/dist/CRUDRepositoryBuilder.js +30 -0
  9. package/dist/CRUDRepositoryOptions.js +1 -0
  10. package/dist/CRUDRepositoryStatements.js +19 -0
  11. package/dist/CascadeDeleteEnrichmentStrategy.js +28 -0
  12. package/dist/CascadeDeleteUpdateEnrichmentStrategy.js +25 -0
  13. package/dist/CommandMiddlewareHost.js +73 -0
  14. package/dist/ConsoleCommandMiddleware.js +45 -0
  15. package/dist/CreateEnrichmentStrategy.js +64 -0
  16. package/dist/Datasource.js +98 -0
  17. package/dist/DatasourceError.js +6 -0
  18. package/dist/DatasourceFactory.js +76 -0
  19. package/dist/DatasourceOptions.js +1 -0
  20. package/dist/DatasourceUrl.js +28 -0
  21. package/dist/DatasourceUrlParser.js +168 -0
  22. package/dist/DefaultCreateEnrichmentStrategy.js +18 -0
  23. package/dist/DefaultReadonlyEnrichmentStrategy.js +107 -0
  24. package/dist/DefaultUpdateEnrichmentStrategy.js +41 -0
  25. package/dist/DefaultWriteEnrichmentStrategy.js +135 -0
  26. package/dist/DeleteEnrichmentStrategy.js +28 -0
  27. package/dist/DriverLoader.js +87 -0
  28. package/dist/Enrichment.js +1 -0
  29. package/dist/EnrichmentPropertyType.js +6 -0
  30. package/dist/ExpectConsoleMiddleware.js +30 -0
  31. package/dist/FirstResultReader.js +43 -0
  32. package/dist/HashsetOptimizedReadonlyEnrichmentStrategy.js +58 -0
  33. package/dist/IBulkWriteStrategy.js +1 -0
  34. package/dist/ICRUDRepository.js +1 -0
  35. package/dist/ICRUDRepositoryFactory.js +1 -0
  36. package/dist/ICommand.js +6 -0
  37. package/dist/ICommandMiddleware.js +1 -0
  38. package/dist/IConnection.js +1 -0
  39. package/dist/IDatasource.js +1 -0
  40. package/dist/IDatasourceFactory.js +1 -0
  41. package/dist/IDriver.d.ts +4 -0
  42. package/dist/IDriver.js +1 -0
  43. package/dist/IEnriched.js +1 -0
  44. package/dist/IReader.js +1 -0
  45. package/dist/IReadonlyEnrichmentStrategy.js +1 -0
  46. package/dist/IReadonlyRepository.js +1 -0
  47. package/dist/IRepository.js +1 -0
  48. package/dist/IRepositoryFactory.js +1 -0
  49. package/dist/IRepositoryTree.js +1 -0
  50. package/dist/IRepositoryTreeNode.js +1 -0
  51. package/dist/ITransaction.js +1 -0
  52. package/dist/IUnitOfWork.js +1 -0
  53. package/dist/IWriteEnrichmentStrategy.js +1 -0
  54. package/dist/Information.js +1 -0
  55. package/dist/IsolationLevel.js +6 -0
  56. package/dist/LazyWriteEnrichmentStrategy.js +4 -0
  57. package/dist/NestedToObjectEnrichmentStrategy.js +20 -0
  58. package/dist/Parameter.js +1 -0
  59. package/dist/ParameterDirection.js +6 -0
  60. package/dist/ProviderCatalog.js +23 -0
  61. package/dist/ProviderNotImplementedError.js +8 -0
  62. package/dist/ProviderNotInstalledError.js +8 -0
  63. package/dist/ReadonlyRepository.js +150 -0
  64. package/dist/ReadonlyRepositoryBuilder.js +43 -0
  65. package/dist/ReadonlyRepositoryMappingOptions.js +1 -0
  66. package/dist/ReadonlyRepositoryStatements.js +10 -0
  67. package/dist/RepositoryAccess.js +12 -0
  68. package/dist/RepositoryFactory.js +71 -0
  69. package/dist/RepositoryNotRegisteredError.js +8 -0
  70. package/dist/RepositoryTree.js +6 -0
  71. package/dist/RepositoryTreeNode.js +12 -0
  72. package/dist/Response.js +13 -0
  73. package/dist/Row.js +1 -0
  74. package/dist/SingleCommandIBulkWriteStrategy.js +21 -0
  75. package/dist/StatementMappers.js +88 -0
  76. package/dist/StoredEnrichment.js +12 -0
  77. package/dist/StoredProcedureBulkWriteStrategy.js +143 -0
  78. package/dist/StreamingReader.js +53 -0
  79. package/dist/UnitOfWorkTransaction.js +51 -0
  80. package/dist/UpdateEnrichmentStrategy.js +61 -0
  81. package/dist/WriteMode.js +1 -0
  82. package/dist/builders/Field.js +1 -0
  83. package/dist/builders/Scalar.js +1 -0
  84. package/dist/builders/index.js +1 -0
  85. package/dist/collectAsync.js +7 -0
  86. package/dist/converters/Cell.js +1 -0
  87. package/dist/converters/ChangeCasingConverter.js +46 -0
  88. package/dist/converters/Constructable.js +1 -0
  89. package/dist/converters/DefaultValueConverter.d.ts +25 -0
  90. package/dist/converters/DefaultValueConverter.js +183 -0
  91. package/dist/converters/DefaultValueOptions.d.ts +9 -0
  92. package/dist/converters/DefaultValueOptions.js +1 -0
  93. package/dist/converters/DeterministicTypeConverter.d.ts +11 -0
  94. package/dist/converters/DeterministicTypeConverter.js +74 -0
  95. package/dist/converters/IMapping.d.ts +4 -0
  96. package/dist/converters/IMapping.js +1 -0
  97. package/dist/converters/MetaDataRowTypeConverter.js +71 -0
  98. package/dist/converters/PluralizerConverter.js +54 -0
  99. package/dist/converters/RegexConverter.js +12 -0
  100. package/dist/converters/ReplaceConverter.js +10 -0
  101. package/dist/converters/RowTypeConverter.js +25 -0
  102. package/dist/converters/SpecField.d.ts +7 -0
  103. package/dist/converters/SpecField.js +1 -0
  104. package/dist/converters/SpecFieldRules.d.ts +17 -0
  105. package/dist/converters/SpecFieldRules.js +1 -0
  106. package/dist/converters/ToLowerCaseConverter.js +4 -0
  107. package/dist/converters/ToUpperCaseConverter.js +4 -0
  108. package/dist/converters/TypeConverter.js +2 -0
  109. package/dist/createCRUDRepositoryOptions.js +7 -0
  110. package/dist/createReadonlyRepositoryMappingOptions.js +16 -0
  111. package/dist/dotEnv.js +9 -0
  112. package/dist/index.d.ts +9 -2
  113. package/dist/index.js +83 -0
  114. package/dist/mappers/ChangeCasingMapper.js +11 -0
  115. package/dist/mappers/DictionaryMapper.js +13 -0
  116. package/dist/mappers/FlatToNestedMapper.js +105 -0
  117. package/dist/mappers/IFlatToNestedMapper.js +1 -0
  118. package/dist/mappers/IMapper.js +1 -0
  119. package/dist/mappers/IdentityMapper.js +4 -0
  120. package/dist/mappers/PluralizerMapper.js +6 -0
  121. package/dist/mappers/RowTypeMapper.js +7 -0
  122. package/dist/mappers/TransformConverterMapper.js +6 -0
  123. package/dist/mappers/TransformMapper.js +8 -0
  124. package/dist/mappers/TypeMap.js +1 -0
  125. package/dist/mappers/TypeMapGroup.js +1 -0
  126. package/dist/mocks/index.js +9 -0
  127. package/dist/mocks/mock-command.js +42 -0
  128. package/dist/mocks/mock-connection.js +48 -0
  129. package/dist/mocks/mock-datasource.js +44 -0
  130. package/dist/mocks/mock-driver.js +15 -0
  131. package/dist/mocks/mock-reader.js +33 -0
  132. package/dist/mocks/mock-repository.js +61 -0
  133. package/dist/mocks/mock-select-statement.js +13 -0
  134. package/dist/mocks/mock-transaction.js +28 -0
  135. package/dist/mocks/mock-where.js +11 -0
  136. package/dist/parametersToRecord.js +9 -0
  137. package/dist/readerToAsyncIterable.js +7 -0
  138. package/dist/splitStatements.js +106 -0
  139. package/dist/statementParameters.js +25 -0
  140. package/dist/statementUsesParameter.js +2 -0
  141. package/dist/statements/Aggregate.js +7 -0
  142. package/dist/statements/AlterTableStatement.d.ts +33 -0
  143. package/dist/statements/AlterTableStatement.js +9 -0
  144. package/dist/statements/AlterTableStatementTextRenderer.d.ts +9 -0
  145. package/dist/statements/AlterTableStatementTextRenderer.js +33 -0
  146. package/dist/statements/ArrayExpression.js +6 -0
  147. package/dist/statements/BulkDeleteStatement.js +15 -0
  148. package/dist/statements/BulkDeleteStatementTextRenderer.js +15 -0
  149. package/dist/statements/BulkInsertStatement.js +29 -0
  150. package/dist/statements/BulkInsertStatementTextRenderer.js +6 -0
  151. package/dist/statements/BulkUpdateStatement.js +17 -0
  152. package/dist/statements/BulkUpdateStatementTextRenderer.js +20 -0
  153. package/dist/statements/CheckConstraint.js +9 -0
  154. package/dist/statements/Cmp.js +7 -0
  155. package/dist/statements/Column.js +1 -0
  156. package/dist/statements/ColumnDefault.js +8 -0
  157. package/dist/statements/Condition.js +2 -0
  158. package/dist/statements/ConditionRenderer.js +11 -0
  159. package/dist/statements/CreateBulkCreateStoredProcedureStatement.d.ts +13 -0
  160. package/dist/statements/CreateBulkCreateStoredProcedureStatement.js +17 -0
  161. package/dist/statements/CreateBulkCreateStoredProcedureStatementTextRenderer.d.ts +4 -0
  162. package/dist/statements/CreateBulkCreateStoredProcedureStatementTextRenderer.js +5 -0
  163. package/dist/statements/CreateBulkDeleteStoredProcedureStatement.d.ts +13 -0
  164. package/dist/statements/CreateBulkDeleteStoredProcedureStatement.js +17 -0
  165. package/dist/statements/CreateBulkDeleteStoredProcedureStatementTextRenderer.d.ts +4 -0
  166. package/dist/statements/CreateBulkDeleteStoredProcedureStatementTextRenderer.js +5 -0
  167. package/dist/statements/CreateBulkUpdateStoredProcedureStatement.d.ts +13 -0
  168. package/dist/statements/CreateBulkUpdateStoredProcedureStatement.js +17 -0
  169. package/dist/statements/CreateBulkUpdateStoredProcedureStatementTextRenderer.d.ts +4 -0
  170. package/dist/statements/CreateBulkUpdateStoredProcedureStatementTextRenderer.js +5 -0
  171. package/dist/statements/CreateCreateStoredProcedureStatement.d.ts +16 -0
  172. package/dist/statements/CreateCreateStoredProcedureStatement.js +23 -0
  173. package/dist/statements/CreateCreateStoredProcedureStatementTextRenderer.d.ts +4 -0
  174. package/dist/statements/CreateCreateStoredProcedureStatementTextRenderer.js +5 -0
  175. package/dist/statements/CreateDeleteStoredProcedureStatement.d.ts +17 -0
  176. package/dist/statements/CreateDeleteStoredProcedureStatement.js +25 -0
  177. package/dist/statements/CreateDeleteStoredProcedureStatementTextRenderer.d.ts +4 -0
  178. package/dist/statements/CreateDeleteStoredProcedureStatementTextRenderer.js +5 -0
  179. package/dist/statements/CreateIndexStatement.js +13 -0
  180. package/dist/statements/CreateIndexStatementTextRenderer.js +8 -0
  181. package/dist/statements/CreateReadStoredProcedureStatement.d.ts +17 -0
  182. package/dist/statements/CreateReadStoredProcedureStatement.js +25 -0
  183. package/dist/statements/CreateReadStoredProcedureStatementTextRenderer.d.ts +4 -0
  184. package/dist/statements/CreateReadStoredProcedureStatementTextRenderer.js +5 -0
  185. package/dist/statements/CreateRoutineStatement.d.ts +22 -0
  186. package/dist/statements/CreateRoutineStatementTextRenderer.d.ts +4 -0
  187. package/dist/statements/CreateTableStatement.js +11 -0
  188. package/dist/statements/CreateTableStatementTextRenderer.js +65 -0
  189. package/dist/statements/CreateTriggerStatement.d.ts +11 -0
  190. package/dist/statements/CreateTriggerStatement.js +15 -0
  191. package/dist/statements/CreateTriggerStatementTextRenderer.d.ts +4 -0
  192. package/dist/statements/CreateTriggerStatementTextRenderer.js +5 -0
  193. package/dist/statements/CreateUpdateStoredProcedureStatement.d.ts +17 -0
  194. package/dist/statements/CreateUpdateStoredProcedureStatement.js +25 -0
  195. package/dist/statements/CreateUpdateStoredProcedureStatementTextRenderer.d.ts +4 -0
  196. package/dist/statements/CreateUpdateStoredProcedureStatementTextRenderer.js +5 -0
  197. package/dist/statements/DefaultStatementTextRenderer.js +7 -0
  198. package/dist/statements/DeleteStatement.js +9 -0
  199. package/dist/statements/DeleteStatementTextRenderer.js +11 -0
  200. package/dist/statements/DropIndexStatement.d.ts +8 -0
  201. package/dist/statements/DropIndexStatement.js +9 -0
  202. package/dist/statements/DropIndexStatementTextRenderer.d.ts +5 -0
  203. package/dist/statements/DropIndexStatementTextRenderer.js +8 -0
  204. package/dist/statements/DropRoutineStatement.d.ts +7 -0
  205. package/dist/statements/DropRoutineStatement.js +7 -0
  206. package/dist/statements/DropRoutineStatementTextRenderer.d.ts +4 -0
  207. package/dist/statements/DropRoutineStatementTextRenderer.js +5 -0
  208. package/dist/statements/DropTableStatement.d.ts +7 -0
  209. package/dist/statements/DropTableStatement.js +7 -0
  210. package/dist/statements/DropTableStatementTextRenderer.d.ts +5 -0
  211. package/dist/statements/DropTableStatementTextRenderer.js +8 -0
  212. package/dist/statements/DropTriggerStatement.d.ts +8 -0
  213. package/dist/statements/DropTriggerStatement.js +9 -0
  214. package/dist/statements/DropTriggerStatementTextRenderer.d.ts +5 -0
  215. package/dist/statements/DropTriggerStatementTextRenderer.js +8 -0
  216. package/dist/statements/ExecuteStoredProcedureStatement.js +9 -0
  217. package/dist/statements/ExecuteStoredProcedureStatementTextRenderer.js +10 -0
  218. package/dist/statements/ExpressionEvaluator.js +122 -0
  219. package/dist/statements/ExpressionRenderer.js +141 -0
  220. package/dist/statements/ForeignKey.js +24 -0
  221. package/dist/statements/IAlterTableStatement.d.ts +3 -0
  222. package/dist/statements/IAlterTableStatement.js +1 -0
  223. package/dist/statements/IBulkDeleteStatement.js +1 -0
  224. package/dist/statements/IBulkInsertStatement.js +1 -0
  225. package/dist/statements/IBulkUpdateStatement.js +1 -0
  226. package/dist/statements/ICondition.js +1 -0
  227. package/dist/statements/IConditionVisitor.js +1 -0
  228. package/dist/statements/ICreateBulkCreateStoredProcedureStatement.d.ts +3 -0
  229. package/dist/statements/ICreateBulkCreateStoredProcedureStatement.js +1 -0
  230. package/dist/statements/ICreateBulkDeleteStoredProcedureStatement.d.ts +3 -0
  231. package/dist/statements/ICreateBulkDeleteStoredProcedureStatement.js +1 -0
  232. package/dist/statements/ICreateBulkUpdateStoredProcedureStatement.d.ts +3 -0
  233. package/dist/statements/ICreateBulkUpdateStoredProcedureStatement.js +1 -0
  234. package/dist/statements/ICreateCreateStoredProcedureStatement.d.ts +3 -0
  235. package/dist/statements/ICreateCreateStoredProcedureStatement.js +1 -0
  236. package/dist/statements/ICreateDeleteStoredProcedureStatement.d.ts +3 -0
  237. package/dist/statements/ICreateDeleteStoredProcedureStatement.js +1 -0
  238. package/dist/statements/ICreateIndexStatement.js +1 -0
  239. package/dist/statements/ICreateReadStoredProcedureStatement.d.ts +3 -0
  240. package/dist/statements/ICreateReadStoredProcedureStatement.js +1 -0
  241. package/dist/statements/ICreateRoutineStatement.d.ts +3 -0
  242. package/dist/statements/ICreateTableStatement.js +1 -0
  243. package/dist/statements/ICreateTriggerStatement.d.ts +3 -0
  244. package/dist/statements/ICreateTriggerStatement.js +1 -0
  245. package/dist/statements/ICreateUpdateStoredProcedureStatement.d.ts +3 -0
  246. package/dist/statements/ICreateUpdateStoredProcedureStatement.js +1 -0
  247. package/dist/statements/IDeleteStatement.js +1 -0
  248. package/dist/statements/IDropIndexStatement.d.ts +3 -0
  249. package/dist/statements/IDropIndexStatement.js +1 -0
  250. package/dist/statements/IDropRoutineStatement.d.ts +3 -0
  251. package/dist/statements/IDropRoutineStatement.js +1 -0
  252. package/dist/statements/IDropTableStatement.d.ts +3 -0
  253. package/dist/statements/IDropTableStatement.js +1 -0
  254. package/dist/statements/IDropTriggerStatement.d.ts +3 -0
  255. package/dist/statements/IDropTriggerStatement.js +1 -0
  256. package/dist/statements/IExecuteStoredProcedureStatement.js +1 -0
  257. package/dist/statements/IExpression.js +1 -0
  258. package/dist/statements/IIdentityInsertStatement.d.ts +3 -0
  259. package/dist/statements/IIdentityInsertStatement.js +1 -0
  260. package/dist/statements/IInsertStatement.js +1 -0
  261. package/dist/statements/IReturnStatement.js +1 -0
  262. package/dist/statements/ISelectStatement.js +1 -0
  263. package/dist/statements/IStatement.js +1 -0
  264. package/dist/statements/IStatementVisitor.d.ts +28 -0
  265. package/dist/statements/IStatementVisitor.js +1 -0
  266. package/dist/statements/ITableConstraint.js +1 -0
  267. package/dist/statements/IUpdateStatement.js +1 -0
  268. package/dist/statements/IWhere.js +1 -0
  269. package/dist/statements/Identifier.js +6 -0
  270. package/dist/statements/IdentityInsertStatement.d.ts +11 -0
  271. package/dist/statements/IdentityInsertStatement.js +13 -0
  272. package/dist/statements/IdentityInsertStatementTextRenderer.d.ts +6 -0
  273. package/dist/statements/IdentityInsertStatementTextRenderer.js +8 -0
  274. package/dist/statements/InsertStatement.js +9 -0
  275. package/dist/statements/InsertStatementTextRenderer.js +5 -0
  276. package/dist/statements/Join.js +10 -0
  277. package/dist/statements/Literal.js +6 -0
  278. package/dist/statements/Native.js +7 -0
  279. package/dist/statements/NotNull.js +6 -0
  280. package/dist/statements/Operator.js +207 -0
  281. package/dist/statements/OrderBy.js +9 -0
  282. package/dist/statements/PrimaryKey.js +9 -0
  283. package/dist/statements/ReturnStatement.js +9 -0
  284. package/dist/statements/ReturnStatementTextRenderer.js +10 -0
  285. package/dist/statements/RoutineParameter.d.ts +4 -0
  286. package/dist/statements/RoutineParameter.js +1 -0
  287. package/dist/statements/SelectInsertedIdStatement.js +9 -0
  288. package/dist/statements/SelectInsertedIdStatementTextRenderer.js +5 -0
  289. package/dist/statements/SelectStatement.js +25 -0
  290. package/dist/statements/SelectStatementOptions.js +1 -0
  291. package/dist/statements/SelectStatementTextRenderer.js +54 -0
  292. package/dist/statements/StatementEvaluator.js +3 -0
  293. package/dist/statements/StatementParser.js +454 -0
  294. package/dist/statements/StatementRenderer.d.ts +42 -0
  295. package/dist/statements/StatementRenderer.js +140 -0
  296. package/dist/statements/StatementTextRenderer.js +27 -0
  297. package/dist/statements/Subquery.js +6 -0
  298. package/dist/statements/UniqueConstraint.js +9 -0
  299. package/dist/statements/UpdateStatement.js +19 -0
  300. package/dist/statements/UpdateStatementTextRenderer.js +51 -0
  301. package/dist/statements/Where.js +182 -0
  302. package/dist/statements/WhereText.js +10 -0
  303. package/dist/statements/index.d.ts +44 -0
  304. package/dist/statements/index.js +79 -0
  305. package/dist/stubs/StubCommand.js +13 -0
  306. package/dist/stubs/StubConnection.js +14 -0
  307. package/dist/stubs/StubDatasource.js +34 -0
  308. package/dist/stubs/StubReader.js +20 -0
  309. package/dist/stubs/StubRepository.js +17 -0
  310. package/dist/stubs/StubTransaction.js +13 -0
  311. package/dist/stubs/createStubDatasource.js +2 -0
  312. package/dist/stubs/index.js +7 -0
  313. package/dist/stubs/notImplemented.js +4 -0
  314. package/package.json +10 -11
  315. package/src/ArrayReader.test.ts +0 -23
  316. package/src/ArrayReader.ts +0 -32
  317. package/src/BatchCommandIBulkWriteStrategy.ts +0 -228
  318. package/src/BuiltRepository.ts +0 -17
  319. package/src/BulkCRUDRepository.test.ts +0 -183
  320. package/src/BulkCRUDRepository.ts +0 -84
  321. package/src/BulkCommand.ts +0 -6
  322. package/src/BulkWriteEnrichment.ts +0 -19
  323. package/src/BulkWriteStrategy.test.ts +0 -293
  324. package/src/CRUDRepository.test.ts +0 -420
  325. package/src/CRUDRepository.ts +0 -264
  326. package/src/CRUDRepositoryBuilder.ts +0 -53
  327. package/src/CRUDRepositoryOptions.test.ts +0 -76
  328. package/src/CRUDRepositoryOptions.ts +0 -8
  329. package/src/CRUDRepositoryStatements.ts +0 -43
  330. package/src/CascadeDeleteEnrichmentStrategy.ts +0 -51
  331. package/src/CascadeDeleteUpdateEnrichmentStrategy.ts +0 -28
  332. package/src/Command.test.ts +0 -105
  333. package/src/CommandMiddlewareHost.test.ts +0 -98
  334. package/src/CommandMiddlewareHost.ts +0 -113
  335. package/src/Connection.test.ts +0 -34
  336. package/src/ConsoleCommandMiddleware.test.ts +0 -149
  337. package/src/ConsoleCommandMiddleware.ts +0 -64
  338. package/src/CreateEnrichmentStrategy.ts +0 -82
  339. package/src/Datasource.test.ts +0 -63
  340. package/src/Datasource.ts +0 -152
  341. package/src/DatasourceError.test.ts +0 -10
  342. package/src/DatasourceError.ts +0 -6
  343. package/src/DatasourceFactory.test.ts +0 -159
  344. package/src/DatasourceFactory.ts +0 -86
  345. package/src/DatasourceOptions.ts +0 -1
  346. package/src/DatasourceUrl.ts +0 -37
  347. package/src/DatasourceUrlParser.test.ts +0 -173
  348. package/src/DatasourceUrlParser.ts +0 -188
  349. package/src/DefaultCreateEnrichmentStrategy.ts +0 -21
  350. package/src/DefaultReadonlyEnrichmentStrategy.ts +0 -164
  351. package/src/DefaultUpdateEnrichmentStrategy.ts +0 -40
  352. package/src/DefaultWriteEnrichmentStrategy.ts +0 -151
  353. package/src/DeleteEnrichmentStrategy.ts +0 -56
  354. package/src/DriverLoader.ts +0 -97
  355. package/src/Enrichment.ts +0 -15
  356. package/src/EnrichmentPropertyType.ts +0 -9
  357. package/src/ExpectConsoleMiddleware.test.ts +0 -79
  358. package/src/ExpectConsoleMiddleware.ts +0 -47
  359. package/src/FirstResultReader.test.ts +0 -43
  360. package/src/FirstResultReader.ts +0 -49
  361. package/src/HashsetOptimizedReadonlyEnrichmentStrategy.ts +0 -80
  362. package/src/IBulkWriteStrategy.ts +0 -13
  363. package/src/ICRUDRepository.ts +0 -13
  364. package/src/ICRUDRepositoryFactory.ts +0 -8
  365. package/src/ICommand.ts +0 -45
  366. package/src/ICommandMiddleware.ts +0 -20
  367. package/src/IConnection.ts +0 -13
  368. package/src/IDatasource.ts +0 -27
  369. package/src/IDatasourceFactory.ts +0 -6
  370. package/src/IDriver.ts +0 -24
  371. package/src/IEnriched.ts +0 -11
  372. package/src/IReader.ts +0 -8
  373. package/src/IReadonlyEnrichmentStrategy.ts +0 -19
  374. package/src/IReadonlyRepository.ts +0 -21
  375. package/src/IRepository.ts +0 -5
  376. package/src/IRepositoryFactory.ts +0 -8
  377. package/src/IRepositoryTree.ts +0 -5
  378. package/src/IRepositoryTreeNode.ts +0 -8
  379. package/src/ITransaction.ts +0 -9
  380. package/src/IUnitOfWork.ts +0 -5
  381. package/src/IWriteEnrichmentStrategy.ts +0 -8
  382. package/src/Information.ts +0 -5
  383. package/src/IsolationLevel.test.ts +0 -13
  384. package/src/IsolationLevel.ts +0 -8
  385. package/src/LazyWriteEnrichmentStrategy.ts +0 -5
  386. package/src/NestedToObjectEnrichmentStrategy.ts +0 -33
  387. package/src/Parameter.ts +0 -8
  388. package/src/ParameterDirection.ts +0 -9
  389. package/src/ProviderCatalog.test.ts +0 -110
  390. package/src/ProviderCatalog.ts +0 -21
  391. package/src/ProviderNotImplementedError.test.ts +0 -11
  392. package/src/ProviderNotImplementedError.ts +0 -9
  393. package/src/ProviderNotInstalledError.test.ts +0 -11
  394. package/src/ProviderNotInstalledError.ts +0 -9
  395. package/src/ReadonlyRepository.test.ts +0 -406
  396. package/src/ReadonlyRepository.ts +0 -276
  397. package/src/ReadonlyRepositoryBuilder.ts +0 -53
  398. package/src/ReadonlyRepositoryMappingOptions.ts +0 -15
  399. package/src/ReadonlyRepositoryStatements.ts +0 -13
  400. package/src/RepositoryAccess.ts +0 -14
  401. package/src/RepositoryFactory.test.ts +0 -94
  402. package/src/RepositoryFactory.ts +0 -115
  403. package/src/RepositoryNotRegisteredError.ts +0 -9
  404. package/src/RepositoryTree.ts +0 -6
  405. package/src/RepositoryTreeNode.ts +0 -11
  406. package/src/Response.ts +0 -15
  407. package/src/Row.ts +0 -3
  408. package/src/SingleCommandIBulkWriteStrategy.ts +0 -35
  409. package/src/StatementMappers.test.ts +0 -221
  410. package/src/StatementMappers.ts +0 -110
  411. package/src/StoredEnrichment.ts +0 -25
  412. package/src/StoredProcedureBulkWriteStrategy.ts +0 -164
  413. package/src/StreamingReader.test.ts +0 -126
  414. package/src/StreamingReader.ts +0 -64
  415. package/src/Transaction.test.ts +0 -37
  416. package/src/UnitOfWorkTransaction.test.ts +0 -43
  417. package/src/UnitOfWorkTransaction.ts +0 -50
  418. package/src/UpdateEnrichmentStrategy.ts +0 -97
  419. package/src/UserViewCRUDRepository.test.ts +0 -323
  420. package/src/WriteMode.ts +0 -1
  421. package/src/builders/Field.ts +0 -6
  422. package/src/builders/Scalar.ts +0 -1
  423. package/src/builders/builders.test.ts +0 -404
  424. package/src/builders/index.ts +0 -2
  425. package/src/collectAsync.ts +0 -7
  426. package/src/converters/Cell.ts +0 -10
  427. package/src/converters/ChangeCasingConverter.test.ts +0 -34
  428. package/src/converters/ChangeCasingConverter.ts +0 -59
  429. package/src/converters/Constructable.ts +0 -1
  430. package/src/converters/MetaDataRowTypeConverter.ts +0 -80
  431. package/src/converters/PluralizerConverter.test.ts +0 -43
  432. package/src/converters/PluralizerConverter.ts +0 -67
  433. package/src/converters/RegexConverter.test.ts +0 -11
  434. package/src/converters/RegexConverter.ts +0 -14
  435. package/src/converters/ReplaceConverter.test.ts +0 -9
  436. package/src/converters/ReplaceConverter.ts +0 -6
  437. package/src/converters/RowTypeConverter.test.ts +0 -79
  438. package/src/converters/RowTypeConverter.ts +0 -33
  439. package/src/converters/ToLowerCaseConverter.test.ts +0 -9
  440. package/src/converters/ToLowerCaseConverter.ts +0 -4
  441. package/src/converters/ToUpperCaseConverter.test.ts +0 -9
  442. package/src/converters/ToUpperCaseConverter.ts +0 -4
  443. package/src/converters/TypeConverter.ts +0 -6
  444. package/src/createCRUDRepositoryOptions.ts +0 -21
  445. package/src/createReadonlyRepositoryMappingOptions.ts +0 -26
  446. package/src/dotEnv.test.ts +0 -21
  447. package/src/dotEnv.ts +0 -16
  448. package/src/edgeCases.test.ts +0 -485
  449. package/src/index.ts +0 -222
  450. package/src/mappers/ChangeCasingMapper.test.ts +0 -32
  451. package/src/mappers/ChangeCasingMapper.ts +0 -15
  452. package/src/mappers/DictionaryMapper.test.ts +0 -69
  453. package/src/mappers/DictionaryMapper.ts +0 -16
  454. package/src/mappers/FlatToNestedMapper.test.ts +0 -269
  455. package/src/mappers/FlatToNestedMapper.ts +0 -127
  456. package/src/mappers/IFlatToNestedMapper.ts +0 -7
  457. package/src/mappers/IMapper.ts +0 -4
  458. package/src/mappers/IdentityMapper.test.ts +0 -12
  459. package/src/mappers/IdentityMapper.ts +0 -6
  460. package/src/mappers/PluralizerMapper.test.ts +0 -40
  461. package/src/mappers/PluralizerMapper.ts +0 -9
  462. package/src/mappers/RowTypeMapper.test.ts +0 -12
  463. package/src/mappers/RowTypeMapper.ts +0 -13
  464. package/src/mappers/TransformConverterMapper.test.ts +0 -181
  465. package/src/mappers/TransformConverterMapper.ts +0 -11
  466. package/src/mappers/TransformMapper.ts +0 -8
  467. package/src/mappers/TypeMap.ts +0 -10
  468. package/src/mappers/TypeMapGroup.ts +0 -6
  469. package/src/mappers/transformMapper.test.ts +0 -66
  470. package/src/mocks/MockCommand.test.ts +0 -75
  471. package/src/mocks/MockConnection.test.ts +0 -34
  472. package/src/mocks/MockDatasource.test.ts +0 -40
  473. package/src/mocks/MockReader.test.ts +0 -17
  474. package/src/mocks/MockRepository.test.ts +0 -32
  475. package/src/mocks/MockSelectStatement.test.ts +0 -11
  476. package/src/mocks/MockTransaction.test.ts +0 -17
  477. package/src/mocks/MockWhere.test.ts +0 -11
  478. package/src/mocks/index.ts +0 -9
  479. package/src/mocks/mock-command.ts +0 -66
  480. package/src/mocks/mock-connection.ts +0 -57
  481. package/src/mocks/mock-datasource.ts +0 -65
  482. package/src/mocks/mock-driver.ts +0 -27
  483. package/src/mocks/mock-reader.ts +0 -38
  484. package/src/mocks/mock-repository.ts +0 -91
  485. package/src/mocks/mock-select-statement.ts +0 -17
  486. package/src/mocks/mock-transaction.ts +0 -31
  487. package/src/mocks/mock-where.ts +0 -13
  488. package/src/parametersToRecord.test.ts +0 -19
  489. package/src/parametersToRecord.ts +0 -11
  490. package/src/public-surface.test.ts +0 -23
  491. package/src/readWithWhereClauseAndCustomFlatToNestedObjectMappingOptions.test.ts +0 -126
  492. package/src/readerToAsyncIterable.test.ts +0 -39
  493. package/src/readerToAsyncIterable.ts +0 -11
  494. package/src/repository.test.ts +0 -410
  495. package/src/repository.type.test.ts +0 -29
  496. package/src/splitStatements.ts +0 -99
  497. package/src/statementParameters.ts +0 -22
  498. package/src/statementUsesParameter.ts +0 -4
  499. package/src/statements/Aggregate.ts +0 -9
  500. package/src/statements/ArrayExpression.ts +0 -5
  501. package/src/statements/BulkDeleteStatement.ts +0 -18
  502. package/src/statements/BulkDeleteStatementTextRenderer.ts +0 -16
  503. package/src/statements/BulkInsertStatement.ts +0 -37
  504. package/src/statements/BulkInsertStatementTextRenderer.ts +0 -10
  505. package/src/statements/BulkUpdateStatement.ts +0 -24
  506. package/src/statements/BulkUpdateStatementTextRenderer.ts +0 -29
  507. package/src/statements/CheckConstraint.ts +0 -9
  508. package/src/statements/Cmp.ts +0 -12
  509. package/src/statements/Column.ts +0 -10
  510. package/src/statements/ColumnDefault.ts +0 -6
  511. package/src/statements/Condition.ts +0 -3
  512. package/src/statements/ConditionRenderer.ts +0 -17
  513. package/src/statements/CreateIndexStatement.ts +0 -18
  514. package/src/statements/CreateIndexStatementTextRenderer.ts +0 -11
  515. package/src/statements/CreateTableStatement.ts +0 -18
  516. package/src/statements/CreateTableStatementTextRenderer.ts +0 -92
  517. package/src/statements/DefaultStatementTextRenderer.ts +0 -9
  518. package/src/statements/DeleteStatement.ts +0 -15
  519. package/src/statements/DeleteStatementTextRenderer.ts +0 -12
  520. package/src/statements/ExecuteStoredProcedureStatement.ts +0 -15
  521. package/src/statements/ExecuteStoredProcedureStatementTextRenderer.ts +0 -15
  522. package/src/statements/ExpressionEvaluator.ts +0 -166
  523. package/src/statements/ExpressionRenderer.ts +0 -161
  524. package/src/statements/ForeignKey.ts +0 -23
  525. package/src/statements/IBulkDeleteStatement.ts +0 -3
  526. package/src/statements/IBulkInsertStatement.ts +0 -3
  527. package/src/statements/IBulkUpdateStatement.ts +0 -3
  528. package/src/statements/ICondition.ts +0 -5
  529. package/src/statements/IConditionVisitor.ts +0 -7
  530. package/src/statements/ICreateIndexStatement.ts +0 -3
  531. package/src/statements/ICreateTableStatement.ts +0 -3
  532. package/src/statements/IDeleteStatement.ts +0 -6
  533. package/src/statements/IExecuteStoredProcedureStatement.ts +0 -3
  534. package/src/statements/IExpression.ts +0 -1
  535. package/src/statements/IInsertStatement.ts +0 -3
  536. package/src/statements/IReturnStatement.ts +0 -3
  537. package/src/statements/ISelectStatement.ts +0 -6
  538. package/src/statements/IStatement.ts +0 -5
  539. package/src/statements/IStatementVisitor.ts +0 -27
  540. package/src/statements/ITableConstraint.ts +0 -6
  541. package/src/statements/IUpdateStatement.ts +0 -6
  542. package/src/statements/IWhere.ts +0 -7
  543. package/src/statements/Identifier.ts +0 -5
  544. package/src/statements/InsertStatement.ts +0 -15
  545. package/src/statements/InsertStatementTextRenderer.ts +0 -7
  546. package/src/statements/Join.ts +0 -26
  547. package/src/statements/Literal.ts +0 -6
  548. package/src/statements/Native.ts +0 -5
  549. package/src/statements/NotNull.ts +0 -3
  550. package/src/statements/Operator.ts +0 -234
  551. package/src/statements/OrderBy.ts +0 -19
  552. package/src/statements/PrimaryKey.ts +0 -9
  553. package/src/statements/ReturnStatement.ts +0 -15
  554. package/src/statements/ReturnStatementTextRenderer.ts +0 -15
  555. package/src/statements/SelectInsertedIdStatement.test.ts +0 -11
  556. package/src/statements/SelectInsertedIdStatement.ts +0 -11
  557. package/src/statements/SelectInsertedIdStatementTextRenderer.ts +0 -7
  558. package/src/statements/SelectStatement.ts +0 -34
  559. package/src/statements/SelectStatementOptions.ts +0 -16
  560. package/src/statements/SelectStatementTextRenderer.ts +0 -71
  561. package/src/statements/StatementCompile.test.ts +0 -231
  562. package/src/statements/StatementEvaluator.ts +0 -5
  563. package/src/statements/StatementParser.test.ts +0 -304
  564. package/src/statements/StatementParser.ts +0 -461
  565. package/src/statements/StatementRenderer.ts +0 -120
  566. package/src/statements/StatementTextRenderer.ts +0 -60
  567. package/src/statements/Subquery.ts +0 -6
  568. package/src/statements/UniqueConstraint.ts +0 -9
  569. package/src/statements/UpdateStatement.ts +0 -34
  570. package/src/statements/UpdateStatementTextRenderer.ts +0 -63
  571. package/src/statements/Where.ts +0 -250
  572. package/src/statements/WhereText.ts +0 -10
  573. package/src/statements/index.ts +0 -75
  574. package/src/stubs/StubCommand.ts +0 -30
  575. package/src/stubs/StubConnection.ts +0 -21
  576. package/src/stubs/StubDatasource.test.ts +0 -99
  577. package/src/stubs/StubDatasource.ts +0 -60
  578. package/src/stubs/StubReader.ts +0 -25
  579. package/src/stubs/StubRepository.ts +0 -42
  580. package/src/stubs/StubTransaction.ts +0 -17
  581. package/src/stubs/createStubDatasource.ts +0 -4
  582. package/src/stubs/index.ts +0 -7
  583. package/src/stubs/notImplemented.ts +0 -5
  584. package/src/tests/contact/Address.ts +0 -14
  585. package/src/tests/contact/AddressType.ts +0 -6
  586. package/src/tests/contact/Base.ts +0 -7
  587. package/src/tests/contact/Contact.ts +0 -12
  588. package/src/tests/contact/ContactBase.ts +0 -8
  589. package/src/tests/contact/ContactChangeLog.ts +0 -8
  590. package/src/tests/contact/ContactGroup.ts +0 -6
  591. package/src/tests/contact/ContactGroupBase.ts +0 -6
  592. package/src/tests/contact/ContactGroupMember.ts +0 -6
  593. package/src/tests/contact/ContactSource.ts +0 -6
  594. package/src/tests/contact/ContactType.ts +0 -6
  595. package/src/tests/contact/ContactsService.test.ts +0 -118
  596. package/src/tests/contact/ContactsService.ts +0 -32
  597. package/src/tests/contact/ImportContactRequest.ts +0 -4
  598. package/src/tests/contact/ImportContactResult.ts +0 -5
  599. package/src/tests/contact/LegacyContact.ts +0 -7
  600. package/src/tests/contact/LegacyMigrationResult.ts +0 -5
  601. package/src/tests/contact/Phone.ts +0 -9
  602. package/src/tests/contact/PhoneType.ts +0 -6
  603. package/src/tests/contact/asContactsView.ts +0 -63
  604. package/src/tests/contact/contactColumns.ts +0 -40
  605. package/src/tests/contact/contactLookupIds.ts +0 -32
  606. package/src/tests/contact/contactLookups.ts +0 -6
  607. package/src/tests/contact/contactsParity.ts +0 -63
  608. package/src/tests/contact/contactsServiceOf.ts +0 -38
  609. package/src/tests/contact/contactsView.ts +0 -31
  610. package/src/tests/contact/expectContactsView.ts +0 -23
  611. package/src/tests/contact/extraContact.ts +0 -61
  612. package/src/tests/contact/logMapped.ts +0 -5
  613. package/src/tests/contact/seedContacts.ts +0 -31
@@ -1,32 +0,0 @@
1
- import type { IReader } from "./IReader.ts";
2
- import { readerToAsyncIterable } from "./readerToAsyncIterable.ts";
3
-
4
- export class ArrayReader<T = unknown> implements IReader<T> {
5
- private index = -1;
6
- current: T | undefined = undefined;
7
-
8
- constructor(private readonly rows: readonly T[]) {}
9
-
10
- async next(): Promise<boolean> {
11
- this.index += 1;
12
- if (this.index < this.rows.length) {
13
- this.current = this.rows[this.index];
14
- return true;
15
- }
16
- this.current = undefined;
17
- return false;
18
- }
19
-
20
- read(): AsyncIterable<T> {
21
- return readerToAsyncIterable(this);
22
- }
23
-
24
- async nextResult(): Promise<boolean> {
25
- this.current = undefined;
26
- return false;
27
- }
28
-
29
- async dispose(): Promise<void> {}
30
-
31
- [Symbol.asyncDispose] = (): Promise<void> => this.dispose();
32
- }
@@ -1,228 +0,0 @@
1
- import type { CRUDRepository } from "./CRUDRepository.ts";
2
- import type { CRUDRepositoryOptions } from "./CRUDRepositoryOptions.ts";
3
- import type { Response } from "./Response.ts";
4
- import type { IWhere } from "./statements/IWhere.ts";
5
- import type { BulkCommand } from "./BulkCommand.ts";
6
- import { Native } from "./statements/Native.ts";
7
- import type { IBulkWriteStrategy } from "./IBulkWriteStrategy.ts";
8
- import { execute, type ICommand } from "./ICommand.ts";
9
- import type { Cell, Cells } from "./converters/Cell.ts";
10
- import type { Field } from "./builders/Field.ts";
11
- import type { Scalar } from "./builders/Scalar.ts";
12
- import type { IExpression } from "./statements/IExpression.ts";
13
- import {
14
- BulkDeleteStatement,
15
- BulkInsertStatement,
16
- BulkUpdateStatement,
17
- DefaultStatementTextRenderer,
18
- Literal,
19
- Operator,
20
- Where,
21
- } from "./statements/index.ts";
22
- import { DatasourceError } from "./DatasourceError.ts";
23
- import { repositoryParts } from "./CRUDRepositoryBuilder.ts";
24
- import { MetaDataRowTypeConverter } from "./converters/MetaDataRowTypeConverter.ts";
25
- import type { Parameter } from "./Parameter.ts";
26
- import { afterBulkWrite } from "./BulkWriteEnrichment.ts";
27
-
28
- const empty = (): Response => ({ result: null, rowsAffected: 0 });
29
- const budget = 8000;
30
- const maxRows = 250;
31
-
32
- const assigned = (value: Cell): boolean =>
33
- value !== null && value !== "" && value !== 0 && value !== 0n;
34
-
35
- const columnsOf = (rows: readonly { name: string }[][]): string[] => {
36
- const seen = new Set<string>();
37
- const columns: string[] = [];
38
- for (const row of rows)
39
- for (const field of row)
40
- if (!seen.has(field.name)) {
41
- seen.add(field.name);
42
- columns.push(field.name);
43
- }
44
- return columns;
45
- };
46
-
47
- type Inserted = { table: string; fields: Parameter[] };
48
- type Updated = { table: string; fields: Parameter[]; ids: Parameter[] };
49
- type Deleted = { table: string; ids: Parameter[] };
50
-
51
- export class BatchCommandIBulkWriteStrategy<T extends object> implements IBulkWriteStrategy<T> {
52
- repo!: CRUDRepository<T>;
53
- command!: ICommand;
54
- options!: CRUDRepositoryOptions<T>;
55
- private cached?: ReturnType<typeof repositoryParts>["statements"];
56
-
57
- attach = (command: ICommand, options: CRUDRepositoryOptions<T>): void => {
58
- this.command = command;
59
- this.options = options;
60
- };
61
-
62
- create = (items: T[]): Promise<Response> => this.then(this.writeCreates(items), items, "create");
63
-
64
- update = (items: T[], byWhere: IWhere | undefined): Promise<Response> =>
65
- this.then(
66
- byWhere ? this.sendEach(items.map((item) => this.updateCommand(item, byWhere))) : this.writeUpdates(items),
67
- items,
68
- "update",
69
- );
70
-
71
- delete = (items: T[], byWhere: IWhere | undefined): Promise<Response> =>
72
- this.then(
73
- byWhere ? this.sendEach(items.map((item) => this.deleteCommand(item, byWhere))) : this.writeDeletes(items),
74
- items,
75
- "delete",
76
- );
77
-
78
- private then = async (write: Promise<Response>, items: T[], mode: "create" | "update" | "delete"): Promise<Response> => {
79
- const response = await write;
80
- await afterBulkWrite(this.repo, this.options, items, mode);
81
- return response;
82
- };
83
-
84
- private writeCreates = async (items: T[]): Promise<Response> => {
85
- if (items.length === 0) return empty();
86
- const rows = items.map(this.mappedInsert);
87
- const columns = columnsOf(rows.map((row) => row.fields));
88
- return this.chunked(rows, columns.length, (chunk) => {
89
- const statement = new BulkInsertStatement(
90
- rows[0]!.table,
91
- columns,
92
- chunk.map((row) => row.fields),
93
- );
94
- return execute(this.command, statement, statement.parameters);
95
- });
96
- };
97
-
98
- private writeUpdates = async (items: T[]): Promise<Response> => {
99
- if (items.length === 0) return empty();
100
- const rows = items.map(this.mappedUpdate);
101
- const set = columnsOf(rows.map((row) => row.fields));
102
- const ids = columnsOf(rows.map((row) => row.ids));
103
- return this.chunked(rows, set.length + ids.length, (chunk) => {
104
- const statement = new BulkUpdateStatement(rows[0]!.table, set, ids, chunk);
105
- return execute(this.command, statement, statement.parameters);
106
- });
107
- };
108
-
109
- private writeDeletes = async (items: T[]): Promise<Response> => {
110
- if (items.length === 0) return empty();
111
- const rows = items.map(this.mappedDelete);
112
- const ids = columnsOf(rows.map((row) => row.ids));
113
- return this.chunked(rows, ids.length, (chunk) => {
114
- const statement = new BulkDeleteStatement(
115
- rows[0]!.table,
116
- ids,
117
- chunk.map((row) => row.ids),
118
- );
119
- return execute(this.command, statement, statement.parameters);
120
- });
121
- };
122
-
123
- private chunked = async <TRow>(
124
- rows: TRow[],
125
- width: number,
126
- write: (chunk: TRow[]) => Promise<Response>,
127
- ): Promise<Response> => {
128
- const size = Math.min(maxRows, Math.max(1, Math.floor(budget / Math.max(1, width))));
129
- let rowsAffected = 0;
130
- for (let at = 0; at < rows.length; at += size) rowsAffected += (await write(rows.slice(at, at + size))).rowsAffected;
131
- return { result: null, rowsAffected };
132
- };
133
-
134
- private sendEach = async (commands: BulkCommand[]): Promise<Response> => {
135
- let rowsAffected = 0;
136
- for (const command of commands)
137
- rowsAffected += (await this.command.executeNative(new Native(command.text), command.parameters)).rowsAffected;
138
- return { result: null, rowsAffected };
139
- };
140
-
141
- private mappedInsert = (item: T): Inserted => {
142
- const record = this.reverse(item);
143
- const statement = this.statements().insert(
144
- this.fields(record, (col) => !this.ids.includes(col) || assigned(record[col] ?? null)),
145
- );
146
- return { table: statement.table, fields: statement.fields };
147
- };
148
-
149
- private mappedUpdate = (item: T): Updated => {
150
- const record = this.reverse(item);
151
- const fields = this.fields(record, (col) => !this.ids.includes(col));
152
- if (fields.length === 0) throw new DatasourceError("Update requires at least one non-Id field");
153
- const statement = this.statements().update(fields, this.idsWhere(record), (name, value) =>
154
- this.cell(name, value, true),
155
- );
156
- return { table: statement.table, fields: statement.fields, ids: statement.where?.parameters ?? [] };
157
- };
158
-
159
- private mappedDelete = (item: T): Deleted => {
160
- const record = this.reverse(item);
161
- const statement = this.statements().delete(this.idsWhere(record), (name, value) => this.cell(name, value, true));
162
- return { table: statement.table, ids: statement.where?.parameters ?? [] };
163
- };
164
-
165
- private updateCommand = (item: T, byWhere?: IWhere): BulkCommand => {
166
- const record = this.reverse(item);
167
- const fields = this.fields(record, (col) => !this.ids.includes(col));
168
- if (fields.length === 0) throw new DatasourceError("Update requires at least one non-Id field");
169
- const statement = this.statements().update(fields, byWhere ?? this.idsWhere(record), (name, value) =>
170
- this.cell(name, value, byWhere === undefined),
171
- );
172
- return { text: DefaultStatementTextRenderer.instance.render(statement), parameters: statement.parameters };
173
- };
174
-
175
- private deleteCommand = (item: T, byWhere?: IWhere): BulkCommand => {
176
- const record = this.reverse(item);
177
- const statement = this.statements().delete(byWhere ?? this.idsWhere(record), (name, value) =>
178
- this.cell(name, value, byWhere === undefined),
179
- );
180
- const listed = statement.where?.parameters ?? [];
181
- const parameters: Parameter[] = listed.length
182
- ? listed
183
- : DefaultStatementTextRenderer.instance.render(statement).includes("$")
184
- ? this.fields(record, () => true)
185
- : [];
186
- return { text: DefaultStatementTextRenderer.instance.render(statement), parameters };
187
- };
188
-
189
- private statements = () =>
190
- (this.cached ??= repositoryParts(this.command.connection, this.options).statements);
191
-
192
- private get ids(): readonly string[] {
193
- return this.options.ids ?? this.repo.ids;
194
- }
195
-
196
- private reverse = (item: T): Cells => {
197
- const objects = this.options.objectConverter ?? new MetaDataRowTypeConverter<T>();
198
- const row = objects.reverseConvert(item);
199
- return this.options.rowConverter ? this.options.rowConverter.reverseConvert(row) : row;
200
- };
201
-
202
- private fields = (record: Cells, include: (col: string) => boolean): Field[] =>
203
- Object.entries(record)
204
- .filter(([key, value]) => include(key) && value !== null && value !== undefined)
205
- .sort(([left], [right]) => left.localeCompare(right))
206
- .map(([name, value]) => ({ name, value: this.cell(name, value, true) as Scalar }));
207
-
208
- private cell = (property: string, value: Cell, fieldsApplied: boolean): Cell =>
209
- fieldsApplied
210
- ? value
211
- : this.options.objectConverter instanceof MetaDataRowTypeConverter &&
212
- this.options.objectConverter.fields[property]
213
- ? this.options.objectConverter.fields[property]!.reverseConvert(value)
214
- : value;
215
-
216
- private idsWhere = (record: Cells): IWhere => {
217
- const parts: IExpression[] = this.ids.map((col) => {
218
- if (!Object.prototype.hasOwnProperty.call(record, col))
219
- throw new DatasourceError(`Missing Id value "${col}"`);
220
- return new Operator.Equals(col, record[col] as Scalar);
221
- });
222
- return new Where(
223
- parts.length === 0
224
- ? new Operator.Equals(new Literal(1), new Literal(1))
225
- : parts.reduce((left, right) => new Operator.And(left, right)),
226
- );
227
- };
228
- }
@@ -1,17 +0,0 @@
1
- import type { IConnection } from "./IConnection.ts";
2
- import type { Cells } from "./converters/Cell.ts";
3
- import type { Constructable } from "./converters/Constructable.ts";
4
- import type { TypeConverter } from "./converters/TypeConverter.ts";
5
- import type { IMapper } from "./mappers/IMapper.ts";
6
- import type { ReadonlyRepositoryStatements } from "./ReadonlyRepositoryStatements.ts";
7
-
8
- export type BuiltRepository<T = Cells> = {
9
- connection: IConnection;
10
- rowConverter?: TypeConverter<Cells, Cells>;
11
- objectConverter: TypeConverter<T, Cells>;
12
- propertyMappings: IMapper<string, string>;
13
- entityMapper: IMapper<string, string>;
14
- statements: ReadonlyRepositoryStatements;
15
- ids: string[];
16
- type: Constructable<T>;
17
- };
@@ -1,183 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { MemoryDriver } from "@datasources/memory";
3
- import { collectAsync } from "./collectAsync.ts";
4
- import { BulkCRUDRepository } from "./BulkCRUDRepository.ts";
5
- import { DefaultWriteEnrichmentStrategy } from "./DefaultWriteEnrichmentStrategy.ts";
6
- import { DatasourceError } from "./DatasourceError.ts";
7
- import type { IConnection } from "./IConnection.ts";
8
-
9
- class Parent {
10
- id = 0;
11
- label = "";
12
- children: Child[] = [];
13
- }
14
-
15
- class Child {
16
- id = 0;
17
- parent_id = 0;
18
- label = "";
19
- }
20
-
21
- const setup = async (): Promise<IConnection> => {
22
- const connection = new MemoryDriver().connection();
23
- await connection.open();
24
- return connection;
25
- };
26
-
27
- const relate = (parentsRepo: BulkCRUDRepository<Parent>, childrenRepo: BulkCRUDRepository<Child>) => {
28
- parentsRepo.addEnriched({ destinationProperty: "children", sourceProperty: "id", relatedKey: "parent_id", type: "list" }, childrenRepo);
29
- return parentsRepo;
30
- };
31
-
32
- describe("BulkCRUDRepository", () => {
33
- it("creates parents and children", async () => {
34
- const connection = await setup();
35
- const parentsRepo = new BulkCRUDRepository(Parent, connection);
36
- const childrenRepo = new BulkCRUDRepository(Child, connection);
37
- const ids = await relate(parentsRepo, childrenRepo).createBulk([
38
- Object.assign(new Parent(), { children: [Object.assign(new Child(), { label: "a" })] }),
39
- Object.assign(new Parent(), {
40
- children: [Object.assign(new Child(), { label: "b" }), Object.assign(new Child(), { label: "c" })],
41
- }),
42
- ]);
43
- const parents = await collectAsync(parentsRepo.read());
44
- const children = await collectAsync(childrenRepo.read());
45
- expect(parents).toHaveLength(2);
46
- expect(parents.every((parent) => parent.id > 0)).toBe(true);
47
- expect(children).toHaveLength(3);
48
- expect(ids.map((row) => row.id).sort()).toEqual(parents.map((parent) => parent.id).sort());
49
- });
50
-
51
- it("createBulk writes each parent", async () => {
52
- const parentsRepo = new BulkCRUDRepository(Parent, await setup());
53
- const ids = await parentsRepo.createBulk([
54
- Object.assign(new Parent(), { label: "a" }),
55
- Object.assign(new Parent(), { label: "b" }),
56
- ]);
57
- const parents = await collectAsync(parentsRepo.read());
58
- expect(parents).toHaveLength(2);
59
- expect(ids.map((row) => row.id).sort()).toEqual(parents.map((parent) => parent.id).sort());
60
- });
61
-
62
- it("createBulk returns composite ids", async () => {
63
- class Coded {
64
- code = "";
65
- code_extra = "";
66
- label = "";
67
- }
68
- const codesRepo = new BulkCRUDRepository<Coded>(await setup(), {
69
- type: Coded,
70
- ids: ["code", "code_extra"],
71
- });
72
- const ids = await codesRepo.createBulk([
73
- Object.assign(new Coded(), { code: "a", code_extra: "ab", label: "one" }),
74
- Object.assign(new Coded(), { code: "b", code_extra: "ba", label: "two" }),
75
- ]);
76
- expect(ids).toEqual([
77
- Object.assign(new Coded(), { code: "a", code_extra: "ab", label: "one" }),
78
- Object.assign(new Coded(), { code: "b", code_extra: "ba", label: "two" }),
79
- ]);
80
- });
81
-
82
- it("keeps the first write when a later bulk update throws", async () => {
83
- const parentsRepo = new BulkCRUDRepository(Parent, await setup());
84
- const first = await parentsRepo.create(Object.assign(new Parent(), { label: "a" }));
85
- expect(first.id).toBeGreaterThan(0);
86
- const second = await parentsRepo.create(Object.assign(new Parent(), { label: "b" }));
87
- expect(second.id).toBeGreaterThan(0);
88
- let seen = 0;
89
- parentsRepo.addMiddleware({
90
- beforeCommand() {
91
- seen += 1;
92
- if (seen === 2) throw new DatasourceError("stop");
93
- },
94
- afterCommand() {},
95
- });
96
- await expect(parentsRepo.updateBulk([
97
- Object.assign(new Parent(), { id: first.id, label: "changed" }),
98
- Object.assign(new Parent(), { id: first.id, label: "later" }),
99
- ])).rejects.toThrow(/stop/);
100
- const stored = await collectAsync(parentsRepo.read());
101
- expect(stored.find((parent) => parent.id === first.id)?.label).toBe("changed");
102
- });
103
-
104
- it("rolls back a bulk update when useTransaction is on", async () => {
105
- const parentsRepo = new BulkCRUDRepository<Parent>(await setup(), {
106
- type: Parent,
107
- write: new DefaultWriteEnrichmentStrategy(undefined, undefined, undefined, true),
108
- });
109
- const first = await parentsRepo.create(Object.assign(new Parent(), { label: "a" }));
110
- expect(first.id).toBeGreaterThan(0);
111
- const second = await parentsRepo.create(Object.assign(new Parent(), { label: "b" }));
112
- expect(second.id).toBeGreaterThan(0);
113
- let seen = 0;
114
- parentsRepo.addMiddleware({
115
- beforeCommand() {
116
- seen += 1;
117
- if (seen === 2) throw new DatasourceError("stop");
118
- },
119
- afterCommand() {},
120
- });
121
- await expect(parentsRepo.updateBulk([
122
- Object.assign(new Parent(), { id: first.id, label: "changed" }),
123
- Object.assign(new Parent(), { id: first.id, label: "later" }),
124
- ])).rejects.toThrow(/stop/);
125
- const stored = await collectAsync(parentsRepo.read());
126
- expect(stored.find((parent) => parent.id === first.id)?.label).toBe("a");
127
- });
128
-
129
- it("update replace-syncs each parent", async () => {
130
- const connection = await setup();
131
- const parentsRepo = new BulkCRUDRepository(Parent, connection);
132
- const childrenRepo = new BulkCRUDRepository(Child, connection);
133
- const first = await parentsRepo.create(Object.assign(new Parent(), { label: "one" }));
134
- expect(first.id).toBeGreaterThan(0);
135
- const second = await parentsRepo.create(Object.assign(new Parent(), { label: "two" }));
136
- expect(second.id).toBeGreaterThan(0);
137
- const kept = await childrenRepo.create(Object.assign(new Child(), { parent_id: first.id, label: "a" }));
138
- expect(kept.id).toBeGreaterThan(0);
139
- const dropped = await childrenRepo.create(Object.assign(new Child(), { parent_id: second.id, label: "b" }));
140
- expect(dropped.id).toBeGreaterThan(0);
141
- const response = await relate(parentsRepo, childrenRepo).updateBulk([
142
- Object.assign(new Parent(), {
143
- id: first.id,
144
- label: "one",
145
- children: [Object.assign(new Child(), { id: kept.id, label: "aa" })],
146
- }),
147
- Object.assign(new Parent(), {
148
- id: second.id,
149
- label: "two",
150
- children: [Object.assign(new Child(), { label: "c" })],
151
- }),
152
- ]);
153
- expect(response.rowsAffected).toBe(2);
154
- const children = await collectAsync(childrenRepo.read());
155
- expect(children).toHaveLength(2);
156
- expect(children.find((child) => child.parent_id === first.id)?.label).toBe("aa");
157
- expect(children.find((child) => child.parent_id === second.id)?.label).toBe("c");
158
- expect(children.some((child) => child.label === "b")).toBe(false);
159
- });
160
-
161
- it("delete cascades each parent", async () => {
162
- const connection = await setup();
163
- const parentsRepo = new BulkCRUDRepository(Parent, connection);
164
- const childrenRepo = new BulkCRUDRepository(Child, connection);
165
- const first = await parentsRepo.create(Object.assign(new Parent(), { label: "one" }));
166
- expect(first.id).toBeGreaterThan(0);
167
- const second = await parentsRepo.create(Object.assign(new Parent(), { label: "two" }));
168
- expect(second.id).toBeGreaterThan(0);
169
- const firstChild = await childrenRepo.create(Object.assign(new Child(), { parent_id: first.id, label: "a" }));
170
- expect(firstChild.id).toBeGreaterThan(0);
171
- const secondChild = await childrenRepo.create(Object.assign(new Child(), { parent_id: second.id, label: "b" }));
172
- expect(secondChild.id).toBeGreaterThan(0);
173
- const kept = await childrenRepo.create(Object.assign(new Child(), { label: "keep" }));
174
- expect(kept.id).toBeGreaterThan(0);
175
- const response = await relate(parentsRepo, childrenRepo).deleteBulk([
176
- Object.assign(new Parent(), { id: first.id }),
177
- Object.assign(new Parent(), { id: second.id }),
178
- ]);
179
- expect(response.rowsAffected).toBe(2);
180
- expect(await collectAsync(parentsRepo.read())).toEqual([]);
181
- expect((await collectAsync(childrenRepo.read())).map((child) => child.label)).toEqual(["keep"]);
182
- });
183
- });
@@ -1,84 +0,0 @@
1
- import type { IConnection } from "./IConnection.ts";
2
- import type { Constructable } from "./converters/Constructable.ts";
3
- import type { Cells } from "./converters/Cell.ts";
4
- import { CRUDRepository } from "./CRUDRepository.ts";
5
- import type { CRUDRepositoryOptions } from "./CRUDRepositoryOptions.ts";
6
- import { createCRUDRepositoryOptions } from "./createCRUDRepositoryOptions.ts";
7
- import type { Response } from "./Response.ts";
8
- import type { IWhere } from "./statements/IWhere.ts";
9
- import type { IBulkWriteStrategy } from "./IBulkWriteStrategy.ts";
10
- import { SingleCommandIBulkWriteStrategy } from "./SingleCommandIBulkWriteStrategy.ts";
11
- import { UnitOfWorkTransaction } from "./UnitOfWorkTransaction.ts";
12
-
13
- const isBulkStrategy = <T extends object>(value: object): value is IBulkWriteStrategy<T> =>
14
- "create" in value &&
15
- "update" in value &&
16
- "delete" in value &&
17
- !("persist" in value) &&
18
- !("createCommand" in value) &&
19
- !("statements" in value);
20
-
21
- const transactionOf = <T extends object>(
22
- options: IConnection | CRUDRepositoryOptions<T> | IBulkWriteStrategy<T> | undefined,
23
- ): boolean =>
24
- options !== undefined && "write" in options ? options.write?.useTransaction ?? false : false;
25
-
26
- const inTransaction = async <TResult>(
27
- transactional: boolean,
28
- connection: IConnection,
29
- write: () => Promise<TResult>,
30
- ): Promise<TResult> => {
31
- if (!transactional) return write();
32
- const work = new UnitOfWorkTransaction(connection);
33
- await work.begin();
34
- try {
35
- const result = await write();
36
- await work.commit();
37
- return result;
38
- } catch (error) {
39
- await work.abort();
40
- throw error;
41
- }
42
- };
43
-
44
- export class BulkCRUDRepository<T extends object = Cells> extends CRUDRepository<T> {
45
- private readonly strategy: IBulkWriteStrategy<T>;
46
- private readonly transactional: boolean;
47
-
48
- constructor(type: Constructable<T>, connection: IConnection, bulk?: IBulkWriteStrategy<T>);
49
- constructor(connection: IConnection, options: CRUDRepositoryOptions<T>, bulk?: IBulkWriteStrategy<T>);
50
- constructor(
51
- typeOrConnection: Constructable<T> | IConnection,
52
- connectionOrOptions?: IConnection | CRUDRepositoryOptions<T> | IBulkWriteStrategy<T>,
53
- bulk?: IBulkWriteStrategy<T>,
54
- ) {
55
- const strategy = bulk ?? (isBulkStrategy<T>(connectionOrOptions ?? {}) ? connectionOrOptions : undefined);
56
- const transactional = transactionOf(connectionOrOptions);
57
- const parent = (
58
- isBulkStrategy(connectionOrOptions ?? {}) ? undefined : connectionOrOptions
59
- ) as IConnection & CRUDRepositoryOptions<T>;
60
- super(typeOrConnection as Constructable<T> & IConnection, parent);
61
- this.strategy = strategy ?? new SingleCommandIBulkWriteStrategy<T>();
62
- this.transactional = transactional;
63
- this.strategy.repo = this;
64
- this.strategy.attach(
65
- this.command(),
66
- typeof typeOrConnection === "function"
67
- ? createCRUDRepositoryOptions(typeOrConnection)
68
- : parent,
69
- );
70
- }
71
-
72
- createBulk = async (items: T[]): Promise<T[]> => {
73
- await inTransaction(this.transactional || items.length > 0, this.command().connection, () =>
74
- this.strategy.create(items),
75
- );
76
- return items;
77
- };
78
-
79
- updateBulk = (items: T[], byWhere?: IWhere): Promise<Response> =>
80
- inTransaction(this.transactional, this.command().connection, () => this.strategy.update(items, byWhere));
81
-
82
- deleteBulk = (items: T[], byWhere?: IWhere): Promise<Response> =>
83
- inTransaction(this.transactional, this.command().connection, () => this.strategy.delete(items, byWhere));
84
- }
@@ -1,6 +0,0 @@
1
- import type { Parameter } from "./Parameter.ts";
2
-
3
- export interface BulkCommand {
4
- text: string;
5
- parameters: Parameter[];
6
- }
@@ -1,19 +0,0 @@
1
- import type { CRUDRepository } from "./CRUDRepository.ts";
2
- import type { CRUDRepositoryOptions } from "./CRUDRepositoryOptions.ts";
3
- import { DefaultWriteEnrichmentStrategy } from "./DefaultWriteEnrichmentStrategy.ts";
4
- import { enrichmentsOf } from "./ReadonlyRepository.ts";
5
- import { RepositoryTree } from "./RepositoryTree.ts";
6
- import { RepositoryTreeNode } from "./RepositoryTreeNode.ts";
7
- import type { WriteMode } from "./WriteMode.ts";
8
-
9
- export const afterBulkWrite = async <T extends object>(
10
- repo: CRUDRepository<T>,
11
- options: CRUDRepositoryOptions<T>,
12
- items: T[],
13
- mode: WriteMode,
14
- ): Promise<void> => {
15
- if (items.length === 0 || !enrichmentsOf(repo)?.length) return;
16
- const write = options.write ?? new DefaultWriteEnrichmentStrategy<T>();
17
- const tree = new RepositoryTree(new RepositoryTreeNode(repo, ""));
18
- await (write.persistBulk ?? write.persist)(tree, items, mode);
19
- };