@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
@@ -0,0 +1,27 @@
1
+ import { readerToAsyncIterable } from "./readerToAsyncIterable.js";
2
+ export class ArrayReader {
3
+ rows;
4
+ index = -1;
5
+ current = undefined;
6
+ constructor(rows) {
7
+ this.rows = rows;
8
+ }
9
+ async next() {
10
+ this.index += 1;
11
+ if (this.index < this.rows.length) {
12
+ this.current = this.rows[this.index];
13
+ return true;
14
+ }
15
+ this.current = undefined;
16
+ return false;
17
+ }
18
+ read() {
19
+ return readerToAsyncIterable(this);
20
+ }
21
+ async nextResult() {
22
+ this.current = undefined;
23
+ return false;
24
+ }
25
+ async dispose() { }
26
+ [Symbol.asyncDispose] = () => this.dispose();
27
+ }
@@ -0,0 +1,150 @@
1
+ import { Native } from "./statements/Native.js";
2
+ import { execute } from "./ICommand.js";
3
+ import { BulkDeleteStatement, BulkInsertStatement, BulkUpdateStatement, DefaultStatementTextRenderer, Literal, Operator, Where, } from "./statements/index.js";
4
+ import { DatasourceError } from "./DatasourceError.js";
5
+ import { repositoryParts } from "./CRUDRepositoryBuilder.js";
6
+ import { MetaDataRowTypeConverter } from "./converters/MetaDataRowTypeConverter.js";
7
+ import { afterBulkWrite } from "./BulkWriteEnrichment.js";
8
+ const empty = () => ({ result: null, rowsAffected: 0 });
9
+ const budget = 8000;
10
+ const maxRows = 250;
11
+ const assigned = (value) => value !== null && value !== "" && value !== 0 && value !== 0n;
12
+ const columnsOf = (rows) => {
13
+ const seen = new Set();
14
+ const columns = [];
15
+ for (const row of rows)
16
+ for (const field of row)
17
+ if (!seen.has(field.name)) {
18
+ seen.add(field.name);
19
+ columns.push(field.name);
20
+ }
21
+ return columns;
22
+ };
23
+ export class BatchCommandIBulkWriteStrategy {
24
+ repo;
25
+ command;
26
+ options;
27
+ cached;
28
+ attach = (command, options) => {
29
+ this.command = command;
30
+ this.options = options;
31
+ };
32
+ create = (items) => this.then(this.writeCreates(items), items, "create");
33
+ update = (items, byWhere) => this.then(byWhere ? this.sendEach(items.map((item) => this.updateCommand(item, byWhere))) : this.writeUpdates(items), items, "update");
34
+ delete = (items, byWhere) => this.then(byWhere ? this.sendEach(items.map((item) => this.deleteCommand(item, byWhere))) : this.writeDeletes(items), items, "delete");
35
+ then = async (write, items, mode) => {
36
+ const response = await write;
37
+ await afterBulkWrite(this.repo, this.options, items, mode);
38
+ return response;
39
+ };
40
+ writeCreates = async (items) => {
41
+ if (items.length === 0)
42
+ return empty();
43
+ const rows = items.map(this.mappedInsert);
44
+ const columns = columnsOf(rows.map((row) => row.fields));
45
+ return this.chunked(rows, columns.length, (chunk) => {
46
+ const statement = new BulkInsertStatement(rows[0].table, columns, chunk.map((row) => row.fields));
47
+ return execute(this.command, statement, statement.parameters);
48
+ });
49
+ };
50
+ writeUpdates = async (items) => {
51
+ if (items.length === 0)
52
+ return empty();
53
+ const rows = items.map(this.mappedUpdate);
54
+ const set = columnsOf(rows.map((row) => row.fields));
55
+ const ids = columnsOf(rows.map((row) => row.ids));
56
+ return this.chunked(rows, set.length + ids.length, (chunk) => {
57
+ const statement = new BulkUpdateStatement(rows[0].table, set, ids, chunk);
58
+ return execute(this.command, statement, statement.parameters);
59
+ });
60
+ };
61
+ writeDeletes = async (items) => {
62
+ if (items.length === 0)
63
+ return empty();
64
+ const rows = items.map(this.mappedDelete);
65
+ const ids = columnsOf(rows.map((row) => row.ids));
66
+ return this.chunked(rows, ids.length, (chunk) => {
67
+ const statement = new BulkDeleteStatement(rows[0].table, ids, chunk.map((row) => row.ids));
68
+ return execute(this.command, statement, statement.parameters);
69
+ });
70
+ };
71
+ chunked = async (rows, width, write) => {
72
+ const size = Math.min(maxRows, Math.max(1, Math.floor(budget / Math.max(1, width))));
73
+ let rowsAffected = 0;
74
+ for (let at = 0; at < rows.length; at += size)
75
+ rowsAffected += (await write(rows.slice(at, at + size))).rowsAffected;
76
+ return { result: null, rowsAffected };
77
+ };
78
+ sendEach = async (commands) => {
79
+ let rowsAffected = 0;
80
+ for (const command of commands)
81
+ rowsAffected += (await this.command.executeNative(new Native(command.text), command.parameters)).rowsAffected;
82
+ return { result: null, rowsAffected };
83
+ };
84
+ mappedInsert = (item) => {
85
+ const record = this.reverse(item);
86
+ const statement = this.statements().insert(this.fields(record, (col) => !this.ids.includes(col) || assigned(record[col] ?? null)));
87
+ return { table: statement.table, fields: statement.fields };
88
+ };
89
+ mappedUpdate = (item) => {
90
+ const record = this.reverse(item);
91
+ const fields = this.fields(record, (col) => !this.ids.includes(col));
92
+ if (fields.length === 0)
93
+ throw new DatasourceError("Update requires at least one non-Id field");
94
+ const statement = this.statements().update(fields, this.idsWhere(record), (name, value) => this.cell(name, value, true));
95
+ return { table: statement.table, fields: statement.fields, ids: statement.where?.parameters ?? [] };
96
+ };
97
+ mappedDelete = (item) => {
98
+ const record = this.reverse(item);
99
+ const statement = this.statements().delete(this.idsWhere(record), (name, value) => this.cell(name, value, true));
100
+ return { table: statement.table, ids: statement.where?.parameters ?? [] };
101
+ };
102
+ updateCommand = (item, byWhere) => {
103
+ const record = this.reverse(item);
104
+ const fields = this.fields(record, (col) => !this.ids.includes(col));
105
+ if (fields.length === 0)
106
+ throw new DatasourceError("Update requires at least one non-Id field");
107
+ const statement = this.statements().update(fields, byWhere ?? this.idsWhere(record), (name, value) => this.cell(name, value, byWhere === undefined));
108
+ return { text: DefaultStatementTextRenderer.instance.render(statement), parameters: statement.parameters };
109
+ };
110
+ deleteCommand = (item, byWhere) => {
111
+ const record = this.reverse(item);
112
+ const statement = this.statements().delete(byWhere ?? this.idsWhere(record), (name, value) => this.cell(name, value, byWhere === undefined));
113
+ const listed = statement.where?.parameters ?? [];
114
+ const parameters = listed.length
115
+ ? listed
116
+ : DefaultStatementTextRenderer.instance.render(statement).includes("$")
117
+ ? this.fields(record, () => true)
118
+ : [];
119
+ return { text: DefaultStatementTextRenderer.instance.render(statement), parameters };
120
+ };
121
+ statements = () => (this.cached ??= repositoryParts(this.command.connection, this.options).statements);
122
+ get ids() {
123
+ return this.options.ids ?? this.repo.ids;
124
+ }
125
+ reverse = (item) => {
126
+ const objects = this.options.objectConverter ?? new MetaDataRowTypeConverter();
127
+ const row = objects.reverseConvert(item);
128
+ return this.options.rowConverter ? this.options.rowConverter.reverseConvert(row) : row;
129
+ };
130
+ fields = (record, include) => Object.entries(record)
131
+ .filter(([key, value]) => include(key) && value !== null && value !== undefined)
132
+ .sort(([left], [right]) => left.localeCompare(right))
133
+ .map(([name, value]) => ({ name, value: this.cell(name, value, true) }));
134
+ cell = (property, value, fieldsApplied) => fieldsApplied
135
+ ? value
136
+ : this.options.objectConverter instanceof MetaDataRowTypeConverter &&
137
+ this.options.objectConverter.fields[property]
138
+ ? this.options.objectConverter.fields[property].reverseConvert(value)
139
+ : value;
140
+ idsWhere = (record) => {
141
+ const parts = this.ids.map((col) => {
142
+ if (!Object.prototype.hasOwnProperty.call(record, col))
143
+ throw new DatasourceError(`Missing Id value "${col}"`);
144
+ return new Operator.Equals(col, record[col]);
145
+ });
146
+ return new Where(parts.length === 0
147
+ ? new Operator.Equals(new Literal(1), new Literal(1))
148
+ : parts.reduce((left, right) => new Operator.And(left, right)));
149
+ };
150
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import { CRUDRepository } from "./CRUDRepository.js";
2
+ import { createCRUDRepositoryOptions } from "./createCRUDRepositoryOptions.js";
3
+ import { SingleCommandIBulkWriteStrategy } from "./SingleCommandIBulkWriteStrategy.js";
4
+ import { UnitOfWorkTransaction } from "./UnitOfWorkTransaction.js";
5
+ const isBulkStrategy = (value) => "create" in value &&
6
+ "update" in value &&
7
+ "delete" in value &&
8
+ !("persist" in value) &&
9
+ !("createCommand" in value) &&
10
+ !("statements" in value);
11
+ const transactionOf = (options) => options !== undefined && "write" in options ? options.write?.useTransaction ?? false : false;
12
+ const inTransaction = async (transactional, connection, write) => {
13
+ if (!transactional)
14
+ return write();
15
+ const work = new UnitOfWorkTransaction(connection);
16
+ await work.begin();
17
+ try {
18
+ const result = await write();
19
+ await work.commit();
20
+ return result;
21
+ }
22
+ catch (error) {
23
+ await work.abort();
24
+ throw error;
25
+ }
26
+ };
27
+ export class BulkCRUDRepository extends CRUDRepository {
28
+ strategy;
29
+ transactional;
30
+ constructor(typeOrConnection, connectionOrOptions, bulk) {
31
+ const strategy = bulk ?? (isBulkStrategy(connectionOrOptions ?? {}) ? connectionOrOptions : undefined);
32
+ const transactional = transactionOf(connectionOrOptions);
33
+ const parent = (isBulkStrategy(connectionOrOptions ?? {}) ? undefined : connectionOrOptions);
34
+ super(typeOrConnection, parent);
35
+ this.strategy = strategy ?? new SingleCommandIBulkWriteStrategy();
36
+ this.transactional = transactional;
37
+ this.strategy.repo = this;
38
+ this.strategy.attach(this.command(), typeof typeOrConnection === "function"
39
+ ? createCRUDRepositoryOptions(typeOrConnection)
40
+ : parent);
41
+ }
42
+ createBulk = async (items) => {
43
+ await inTransaction(this.transactional || items.length > 0, this.command().connection, () => this.strategy.create(items));
44
+ return items;
45
+ };
46
+ updateBulk = (items, byWhere) => inTransaction(this.transactional, this.command().connection, () => this.strategy.update(items, byWhere));
47
+ deleteBulk = (items, byWhere) => inTransaction(this.transactional, this.command().connection, () => this.strategy.delete(items, byWhere));
48
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { DefaultWriteEnrichmentStrategy } from "./DefaultWriteEnrichmentStrategy.js";
2
+ import { enrichmentsOf } from "./ReadonlyRepository.js";
3
+ import { RepositoryTree } from "./RepositoryTree.js";
4
+ import { RepositoryTreeNode } from "./RepositoryTreeNode.js";
5
+ export const afterBulkWrite = async (repo, options, items, mode) => {
6
+ if (items.length === 0 || !enrichmentsOf(repo)?.length)
7
+ return;
8
+ const write = options.write ?? new DefaultWriteEnrichmentStrategy();
9
+ const tree = new RepositoryTree(new RepositoryTreeNode(repo, ""));
10
+ await (write.persistBulk ?? write.persist)(tree, items, mode);
11
+ };
@@ -0,0 +1,182 @@
1
+ import { Literal } from "./statements/Literal.js";
2
+ import { DefaultStatementTextRenderer, Operator, Where } from "./statements/index.js";
3
+ import { repositoryParts } from "./CRUDRepositoryBuilder.js";
4
+ import { MetaDataRowTypeConverter } from "./converters/MetaDataRowTypeConverter.js";
5
+ import { enrichmentsOf, ReadonlyRepository } from "./ReadonlyRepository.js";
6
+ import { DefaultReadonlyEnrichmentStrategy } from "./DefaultReadonlyEnrichmentStrategy.js";
7
+ import { execute, executeReader } from "./ICommand.js";
8
+ import { DatasourceError } from "./DatasourceError.js";
9
+ import { DefaultWriteEnrichmentStrategy } from "./DefaultWriteEnrichmentStrategy.js";
10
+ import { UnitOfWorkTransaction } from "./UnitOfWorkTransaction.js";
11
+ import { RepositoryTree } from "./RepositoryTree.js";
12
+ import { RepositoryTreeNode } from "./RepositoryTreeNode.js";
13
+ const assigned = (value) => value !== null && value !== "" && value !== 0 && value !== 0n;
14
+ const fieldsOf = (record, include, cell, enrichmentInto) => Object.entries(record)
15
+ .filter(([key, value]) => include(key) && !enrichmentInto(key) && value !== null && value !== undefined)
16
+ .sort(([left], [right]) => left.localeCompare(right))
17
+ .map(([name, value]) => ({ name, value: cell(name, value, true) }));
18
+ const isCells = (id) => typeof id === "object" && id !== null;
19
+ const named = (row, property, sqlColumn) => {
20
+ if (property === sqlColumn || !(sqlColumn in row))
21
+ return row;
22
+ const { [sqlColumn]: cell, ...rest } = row;
23
+ return { ...rest, [property]: cell };
24
+ };
25
+ const identified = (row, column) => {
26
+ const values = Object.values(row);
27
+ return column in row || values.length !== 1 ? row : { [column]: values[0] };
28
+ };
29
+ const scalarOf = (value) => value === undefined || value === null || typeof value === "object" ? undefined : value;
30
+ export class CRUDRepository extends ReadonlyRepository {
31
+ ids;
32
+ crudStatements;
33
+ tree;
34
+ write;
35
+ get useTransaction() {
36
+ return this.write.useTransaction;
37
+ }
38
+ constructor(typeOrConnection, connectionOrOptions) {
39
+ const options = connectionOrOptions;
40
+ const opened = repositoryParts(typeOrConnection, options);
41
+ super(opened.built);
42
+ this.ids = opened.built.ids;
43
+ this.crudStatements = opened.statements;
44
+ this.tree = new RepositoryTree(new RepositoryTreeNode(this, ""));
45
+ this.write = options.write ?? new DefaultWriteEnrichmentStrategy();
46
+ }
47
+ addEnriched(enrichment, via, strategy) {
48
+ super.addEnriched(enrichment, via, strategy);
49
+ const writer = writerOf(via);
50
+ if (writer)
51
+ lastEnrichment(this).persist = writer;
52
+ return this;
53
+ }
54
+ addLinked(enrichment, via, link, strategy) {
55
+ const chosen = strategy ?? new DefaultReadonlyEnrichmentStrategy();
56
+ super.addEnriched(enrichment, via, strategy);
57
+ const stored = lastEnrichment(this);
58
+ stored.apply = (parents, sources) => chosen.applyLinked(via, link, enrichment, parents, sources);
59
+ stored.link = link;
60
+ return this;
61
+ }
62
+ create = (item) => this.inTransaction(() => this.createCore(item));
63
+ update = (item, byWhere) => this.inTransaction(() => this.updateCore(item, byWhere));
64
+ delete = (item, byWhere) => this.inTransaction(() => this.deleteCore(item, byWhere));
65
+ inTransaction = async (write) => {
66
+ if (!this.useTransaction)
67
+ return write();
68
+ const work = new UnitOfWorkTransaction(this.command().connection);
69
+ await work.begin();
70
+ try {
71
+ const result = await write();
72
+ await work.commit();
73
+ return result;
74
+ }
75
+ catch (error) {
76
+ await work.abort();
77
+ throw error;
78
+ }
79
+ };
80
+ createCore = async (item) => {
81
+ await this.insert(item);
82
+ if (!this.enriched)
83
+ return item;
84
+ await this.write.persist(this.tree, [item], "create");
85
+ if (this.ids.length !== 1)
86
+ return item;
87
+ const id = this.idValue(item);
88
+ return id === undefined ? item : (await this.readSingleById(id)) ?? item;
89
+ };
90
+ updateCore = async (item, byWhere) => {
91
+ const response = await this.save(item, byWhere);
92
+ if (this.enriched)
93
+ await this.write.persist(this.tree, [item], "update");
94
+ return response;
95
+ };
96
+ deleteCore = async (item, byWhere) => {
97
+ if (this.enriched)
98
+ await this.write.persist(this.tree, [item], "delete");
99
+ return this.remove(item, byWhere);
100
+ };
101
+ readSingleById = async (id) => this.readSingle(this.byId(id));
102
+ insert = async (item) => {
103
+ const record = this.reverseConvert(item);
104
+ const fields = fieldsOf(record, (col) => !this.ids.includes(col) || assigned(record[col] ?? null), this.cell, this.enrichmentInto);
105
+ const statement = this.crudStatements.insert(fields);
106
+ const response = await execute(this.command(), statement, statement.fields);
107
+ if (this.ids.length === 1 && !fields.some((field) => field.name === this.ids[0]))
108
+ await this.copyInsertedId(item, fields);
109
+ return response;
110
+ };
111
+ copyInsertedId = async (target, fields) => {
112
+ void fields;
113
+ const column = this.ids[0];
114
+ const statement = this.crudStatements.selectInsertedId(column);
115
+ const sqlColumn = statement.column;
116
+ const reader = await executeReader(this.command(), statement);
117
+ try {
118
+ if (!(await reader.next()))
119
+ return;
120
+ const current = reader.current;
121
+ if (!current)
122
+ throw new DatasourceError("Reader current must be a row");
123
+ const row = identified(named(current, column, sqlColumn), column);
124
+ const cells = this.rowConverter ? this.rowConverter.convert(row) : row;
125
+ const converted = this.objectConverter instanceof MetaDataRowTypeConverter
126
+ ? this.objectConverter.convert(cells, this.type)
127
+ : this.objectConverter.convert(cells);
128
+ const value = scalarOf(converted[column]);
129
+ if (value !== undefined)
130
+ target[column] = value;
131
+ }
132
+ finally {
133
+ await reader.dispose();
134
+ }
135
+ };
136
+ idValue = (item) => scalarOf(item[this.ids[0]]);
137
+ save = async (item, byWhere) => {
138
+ const record = this.reverseConvert(item);
139
+ const fields = fieldsOf(record, (col) => !this.ids.includes(col), this.cell, this.enrichmentInto);
140
+ if (fields.length === 0)
141
+ throw new DatasourceError("Update requires at least one non-Id field");
142
+ const statement = this.crudStatements.update(fields, byWhere ?? this.idWhere(record), (name, value) => this.cell(name, value, byWhere === undefined));
143
+ return execute(this.command(), statement, statement.parameters);
144
+ };
145
+ remove = async (item, byWhere) => {
146
+ const record = this.reverseConvert(item);
147
+ const statement = this.crudStatements.delete(byWhere ?? this.idWhere(record), (name, value) => this.cell(name, value, byWhere === undefined));
148
+ const listed = statement.where?.parameters ?? [];
149
+ const parameters = listed.length
150
+ ? listed
151
+ : DefaultStatementTextRenderer.instance.render(statement).includes("$")
152
+ ? fieldsOf(record, () => true, this.cell, this.enrichmentInto)
153
+ : [];
154
+ return execute(this.command(), statement, parameters);
155
+ };
156
+ byId = (id) => {
157
+ if (this.ids.length === 0)
158
+ throw new DatasourceError("ReadSingleById requires an Id column");
159
+ if (isCells(id))
160
+ return this.idWhere(id);
161
+ if (this.ids.length !== 1)
162
+ throw new DatasourceError("Composite id requires a row keyed by each Id column");
163
+ return this.idWhere({ [this.ids[0]]: id });
164
+ };
165
+ reverseConvert = (item) => {
166
+ const row = this.objectConverter.reverseConvert(item);
167
+ return this.rowConverter ? this.rowConverter.reverseConvert(row) : row;
168
+ };
169
+ idWhere = (record) => {
170
+ const parts = this.ids.map((col) => {
171
+ if (!Object.prototype.hasOwnProperty.call(record, col))
172
+ throw new DatasourceError(`Missing Id value "${col}"`);
173
+ return new Operator.Equals(col, record[col]);
174
+ });
175
+ return new Where(parts.length === 0
176
+ ? new Operator.Equals(new Literal(1), new Literal(1))
177
+ : parts.reduce((left, right) => new Operator.And(left, right)));
178
+ };
179
+ enrichmentInto = (name) => enrichmentsOf(this).some((entry) => entry.enrichment.destinationProperty === name);
180
+ }
181
+ const writerOf = (via) => "create" in via && typeof via.create === "function" ? via : undefined;
182
+ const lastEnrichment = (host) => enrichmentsOf(host).at(-1);
@@ -0,0 +1,30 @@
1
+ import { defaultId, fieldNamesOf, createCRUDRepositoryOptions } from "./createCRUDRepositoryOptions.js";
2
+ import { CRUDRepository } from "./CRUDRepository.js";
3
+ import { CRUDRepositoryStatements } from "./CRUDRepositoryStatements.js";
4
+ import { ReadonlyRepositoryBuilder } from "./ReadonlyRepositoryBuilder.js";
5
+ import { ReadonlyRepositoryStatements } from "./ReadonlyRepositoryStatements.js";
6
+ const isCrud = (options) => "ids" in options || "write" in options;
7
+ const withIds = (options) => "ids" in options
8
+ ? options
9
+ : {
10
+ ...options,
11
+ ids: options.type ? defaultId(fieldNamesOf(options.type)) : ["id"],
12
+ };
13
+ export const repositoryParts = (typeOrConnection, connectionOrOptions) => {
14
+ const builder = new CRUDRepositoryBuilder();
15
+ const built = typeof typeOrConnection === "function"
16
+ ? builder.parts(connectionOrOptions, createCRUDRepositoryOptions(typeOrConnection))
17
+ : builder.parts(typeOrConnection, withIds(connectionOrOptions));
18
+ return { built, statements: builder.crudStatements };
19
+ };
20
+ export class CRUDRepositoryBuilder extends ReadonlyRepositoryBuilder {
21
+ crudStatements;
22
+ ids = (options) => isCrud(options)
23
+ ? (options.ids ?? (options.type ? defaultId(fieldNamesOf(options.type)) : ["id"]))
24
+ : [];
25
+ statements = (table, columns) => {
26
+ this.crudStatements = new CRUDRepositoryStatements(table, columns, this.entityMapper, this.propertyMapper);
27
+ return new ReadonlyRepositoryStatements(table, columns);
28
+ };
29
+ build = (connection, options) => new CRUDRepository(connection, options);
30
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ import { IdentityMapper } from "./mappers/IdentityMapper.js";
2
+ import { StatementMappers } from "./StatementMappers.js";
3
+ import { DeleteStatement } from "./statements/DeleteStatement.js";
4
+ import { InsertStatement } from "./statements/InsertStatement.js";
5
+ import { SelectInsertedIdStatement } from "./statements/SelectInsertedIdStatement.js";
6
+ import { UpdateStatement } from "./statements/UpdateStatement.js";
7
+ import { ReadonlyRepositoryStatements } from "./ReadonlyRepositoryStatements.js";
8
+ const same = (_name, value) => value;
9
+ export class CRUDRepositoryStatements extends ReadonlyRepositoryStatements {
10
+ mappings;
11
+ constructor(table, columns, entityMappers = new IdentityMapper(), propertyMappers = new IdentityMapper()) {
12
+ super(table, columns);
13
+ this.mappings = new StatementMappers(entityMappers, propertyMappers);
14
+ }
15
+ insert = (fields) => this.mappings.apply(new InsertStatement(this.table, fields), same);
16
+ update = (fields, where, cell = same) => this.mappings.apply(new UpdateStatement(this.table, fields, where), cell);
17
+ delete = (where, cell = same) => this.mappings.apply(new DeleteStatement(this.table, where), cell);
18
+ selectInsertedId = (column) => this.mappings.apply(new SelectInsertedIdStatement(this.table, column), same);
19
+ }
@@ -0,0 +1,28 @@
1
+ import { DatasourceError } from "./DatasourceError.js";
2
+ import { DeleteEnrichmentStrategy } from "./DeleteEnrichmentStrategy.js";
3
+ import { Operator, Where } from "./statements/index.js";
4
+ const get = (item, name) => item[name];
5
+ const present = (value) => value !== undefined && value !== null && typeof value !== "object" && value !== 0 && value !== 0n && value !== "";
6
+ const linkWhere = (association, parentKey, relatedKey) => new Where(new Operator.And(new Operator.Equals(association.parent, parentKey), new Operator.Equals(association.related, relatedKey)));
7
+ export class CascadeDeleteEnrichmentStrategy extends DeleteEnrichmentStrategy {
8
+ async deleteChildren(writer, enrichment, parent, deleteNested) {
9
+ const existing = await DeleteEnrichmentStrategy.load(writer, enrichment, parent);
10
+ await deleteNested(existing);
11
+ for (const row of existing)
12
+ await writer.delete(row, DeleteEnrichmentStrategy.childrenWhere(writer, enrichment, parent));
13
+ }
14
+ async deleteLinked(writer, enrichment, parent) {
15
+ const association = enrichment.association;
16
+ if (!association)
17
+ throw new DatasourceError("Missing association");
18
+ const key = get(parent, enrichment.sourceProperty);
19
+ if (!present(key))
20
+ return;
21
+ for (const row of await DeleteEnrichmentStrategy.loadLinks(writer, association.parent, key)) {
22
+ const id = get(row, association.related);
23
+ if (!present(id))
24
+ continue;
25
+ await writer.delete(row, linkWhere(association, key, id));
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,25 @@
1
+ import { DefaultCreateEnrichmentStrategy } from "./DefaultCreateEnrichmentStrategy.js";
2
+ import { DatasourceError } from "./DatasourceError.js";
3
+ import { DeleteEnrichmentStrategy } from "./DeleteEnrichmentStrategy.js";
4
+ import { UpdateEnrichmentStrategy } from "./UpdateEnrichmentStrategy.js";
5
+ export class CascadeDeleteUpdateEnrichmentStrategy extends UpdateEnrichmentStrategy {
6
+ create = new DefaultCreateEnrichmentStrategy();
7
+ async updateChildren(writer, enrichment, parent) {
8
+ for (const row of await DeleteEnrichmentStrategy.load(writer, enrichment, parent))
9
+ await writer.delete(row, DeleteEnrichmentStrategy.childrenWhere(writer, enrichment, parent));
10
+ await this.create.createChildren(writer, enrichment, parent);
11
+ }
12
+ async updateLinked(writer, enrichment, parent) {
13
+ const association = enrichment.association;
14
+ if (!association)
15
+ throw new DatasourceError("Missing association");
16
+ const parentKey = this.requiredKey(parent, enrichment);
17
+ for (const row of await DeleteEnrichmentStrategy.loadLinks(writer, association.parent, parentKey)) {
18
+ const id = this.getCell(row, association.related);
19
+ if (!this.presentCell(id))
20
+ continue;
21
+ await writer.delete(row, this.linkWhere(association, parentKey, id));
22
+ }
23
+ await this.create.createLinked(writer, enrichment, parent);
24
+ }
25
+ }
@@ -0,0 +1,73 @@
1
+ import { DefaultStatementTextRenderer } from "./statements/DefaultStatementTextRenderer.js";
2
+ import { Native } from "./statements/Native.js";
3
+ import { StatementParser } from "./statements/StatementParser.js";
4
+ const asError = (error) => error instanceof Error ? error : new Error(String(error));
5
+ const resultOf = (value) => value instanceof Date ||
6
+ value instanceof Uint8Array ||
7
+ value === null ||
8
+ typeof value === "string" ||
9
+ typeof value === "number" ||
10
+ typeof value === "boolean" ||
11
+ typeof value === "bigint"
12
+ ? value
13
+ : String(value);
14
+ const isResponse = (value) => "rowsAffected" in value && typeof value.rowsAffected === "number";
15
+ const logged = (value, rows) => rows.length > 0 || value === null || typeof value !== "object" || !isResponse(value)
16
+ ? rows
17
+ : [{ result: resultOf(value.result), rowsAffected: value.rowsAffected }];
18
+ export class CommandMiddlewareHost {
19
+ middlewares = [];
20
+ addMiddleware(middleware) {
21
+ this.middlewares.push(middleware);
22
+ return this;
23
+ }
24
+ execute(text, parameters) {
25
+ if (!text.trim())
26
+ throw new Error("empty command");
27
+ return this.executeStatement(StatementParser.parse(text), parameters);
28
+ }
29
+ executeReader(text, parameters) {
30
+ if (!text.trim())
31
+ throw new Error("empty command");
32
+ return this.executeReaderStatement(StatementParser.parse(text), parameters);
33
+ }
34
+ executeStatement(statement, parameters) {
35
+ return this.executeNative(new Native(DefaultStatementTextRenderer.instance.render(statement)), parameters);
36
+ }
37
+ executeReaderStatement(statement, parameters) {
38
+ return this.executeReaderNative(new Native(DefaultStatementTextRenderer.instance.render(statement)), parameters);
39
+ }
40
+ executeNative(_text, _parameters) {
41
+ throw new Error("executeNative");
42
+ }
43
+ executeReaderNative(_text, _parameters) {
44
+ throw new Error("executeReaderNative");
45
+ }
46
+ async run(text, params, fn) {
47
+ let q = text.trim();
48
+ let p = params;
49
+ for (const middleware of this.middlewares) {
50
+ const rewritten = await middleware.beforeCommand(q, p);
51
+ if (rewritten) {
52
+ q = rewritten.text;
53
+ p = rewritten.params;
54
+ }
55
+ }
56
+ const start = performance.now();
57
+ try {
58
+ const { value, rows } = await fn(q, p);
59
+ const elapsedMs = performance.now() - start;
60
+ for (const middleware of this.middlewares) {
61
+ await middleware.afterCommand(q, p, logged(value, rows), elapsedMs);
62
+ }
63
+ return value;
64
+ }
65
+ catch (error) {
66
+ const elapsedMs = performance.now() - start;
67
+ for (const middleware of this.middlewares) {
68
+ await middleware.afterCommand(q, p, [], elapsedMs, asError(error));
69
+ }
70
+ throw error;
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,45 @@
1
+ export const formatElapsed = (elapsedMs) => elapsedMs < 1
2
+ ? `${Math.round(elapsedMs * 1000)}μs`
3
+ : `${Math.round(elapsedMs)}ms`;
4
+ const cellOf = (value) => value === null
5
+ ? "null"
6
+ : value instanceof Date
7
+ ? value.toISOString()
8
+ : value instanceof Uint8Array
9
+ ? Buffer.from(value).toString("base64")
10
+ : typeof value === "bigint"
11
+ ? String(value)
12
+ : typeof value === "boolean"
13
+ ? value ? "True" : "False"
14
+ : typeof value === "string"
15
+ ? value
16
+ : String(value);
17
+ const paramsOf = (params) => `{${(params ?? []).map((param) => `${param.name}: ${cellOf(param.value)}`).join(", ")}}`;
18
+ const rowsOf = (rows) => rows
19
+ .map((row) => `{${Object.entries(row).sort(([left], [right]) => left < right ? -1 : 1).map(([key, value]) => `${key}: ${cellOf(value)}`).join(", ")}}`)
20
+ .join(", ");
21
+ export class ConsoleCommandMiddleware {
22
+ write;
23
+ now;
24
+ options;
25
+ constructor(write = (line) => {
26
+ console.log(line);
27
+ }, now = () => new Date(), options = {}) {
28
+ this.write = write;
29
+ this.now = now;
30
+ this.options = options;
31
+ }
32
+ beforeCommand = (text, params) => {
33
+ this.write(this.line("Start", text));
34
+ if (this.verbose())
35
+ this.write(this.line("Request", paramsOf(params)));
36
+ };
37
+ afterCommand = (text, _params, results, elapsedMs) => {
38
+ const options = { ...this.options, elapsedMs: formatElapsed(elapsedMs) };
39
+ this.write(`${this.line("Finish", text)} ${options.elapsedMs}`);
40
+ if (this.verbose())
41
+ this.write(this.line("AfterCommand", rowsOf(results)));
42
+ };
43
+ verbose = () => this.options.isVerbose === "true" || this.options.isVerbose === "1";
44
+ line = (phase, text) => `[${this.now().toISOString()}]-[datasource][${phase}]-[${text}]`;
45
+ }