@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,164 +0,0 @@
1
- import type { Scalar } from "./builders/Scalar.ts";
2
- import { DatasourceError } from "./DatasourceError.ts";
3
- import type { Enrichment } from "./Enrichment.ts";
4
- import { EnrichmentPropertyType } from "./EnrichmentPropertyType.ts";
5
- import type { IReadonlyEnrichmentStrategy } from "./IReadonlyEnrichmentStrategy.ts";
6
- import type { IReadonlyRepository } from "./IReadonlyRepository.ts";
7
- import type { Row } from "./Row.ts";
8
- import { Operator, Where } from "./statements/index.ts";
9
-
10
- type Props = Record<string, Scalar | object>;
11
-
12
- export class DefaultReadonlyEnrichmentStrategy<T extends object>
13
- implements IReadonlyEnrichmentStrategy<T>
14
- {
15
- apply<TRelated extends object>(
16
- via: IReadonlyRepository<TRelated>,
17
- enrichment: Enrichment,
18
- parents: T[],
19
- sources?: (Row | undefined)[],
20
- ): Promise<void> {
21
- const type = enrichment.type ?? EnrichmentPropertyType.Object;
22
- const run = {
23
- [EnrichmentPropertyType.List]: () => this.applyList(via, enrichment, parents, sources),
24
- [EnrichmentPropertyType.Object]: () => this.applyObject(via, enrichment, parents, sources),
25
- [EnrichmentPropertyType.Dictionary]: () => this.applyDictionary(via, enrichment, parents, sources),
26
- }[type];
27
- return run ? run() : Promise.reject(new DatasourceError(`Unsupported enrichment type "${type}"`));
28
- }
29
-
30
- async applyLinked<TRelated extends object, TLink extends object>(
31
- via: IReadonlyRepository<TRelated>,
32
- link: IReadonlyRepository<TLink>,
33
- enrichment: Enrichment,
34
- parents: T[],
35
- sources?: (Row | undefined)[],
36
- ): Promise<void> {
37
- const association = enrichment.association ?? (() => {
38
- throw new DatasourceError("Missing association");
39
- })();
40
- for (const [index, parent] of parents.entries()) {
41
- const key = this.sourceKey(parent, enrichment.sourceProperty, sources, index);
42
- if (key === undefined || key === null) continue;
43
- const related: TRelated[] = [];
44
- for await (const row of link.read(
45
- new Where(new Operator.Equals(association.parent, this.scalar(key))),
46
- )) {
47
- const id = this.props(row)[association.related];
48
- if (id === undefined || id === null || typeof id === "object") continue;
49
- const entity = await via.readSingle(new Where(new Operator.Equals(enrichment.relatedKey, id)));
50
- if (entity) related.push(entity);
51
- }
52
- Object.assign(parent, { [enrichment.destinationProperty]: related });
53
- }
54
- }
55
-
56
- protected async applyObject<TRelated extends object>(
57
- via: IReadonlyRepository<TRelated>,
58
- enrichment: Enrichment,
59
- parents: T[],
60
- sources?: (Row | undefined)[],
61
- ): Promise<void> {
62
- const cache = new Map<string, TRelated | undefined>();
63
- for (const [index, parent] of parents.entries()) {
64
- const key = this.sourceKey(parent, enrichment.sourceProperty, sources, index);
65
- if (key === undefined || key === null) continue;
66
- const cacheKey = this.keyOf(key);
67
- if (!cache.has(cacheKey))
68
- cache.set(
69
- cacheKey,
70
- await via.readSingle(new Where(new Operator.Equals(enrichment.relatedKey, this.scalar(key)))),
71
- );
72
- const related = cache.get(cacheKey);
73
- if (!related) continue;
74
- Object.assign(parent, {
75
- [enrichment.destinationProperty]: enrichment.relatedProperty ? this.props(related)[enrichment.relatedProperty] : related,
76
- });
77
- }
78
- }
79
-
80
- protected async applyList<TRelated extends object>(
81
- via: IReadonlyRepository<TRelated>,
82
- enrichment: Enrichment,
83
- parents: T[],
84
- sources?: (Row | undefined)[],
85
- ): Promise<void> {
86
- for (const [index, parent] of parents.entries()) {
87
- const key = this.sourceKey(parent, enrichment.sourceProperty, sources, index);
88
- if (key === undefined || key === null) continue;
89
- const related: TRelated[] = [];
90
- for await (const item of via.read(
91
- new Where(new Operator.Equals(enrichment.relatedKey, this.scalar(key))),
92
- ))
93
- related.push(item);
94
- Object.assign(parent, { [enrichment.destinationProperty]: related });
95
- }
96
- }
97
-
98
- protected async applyDictionary<TRelated extends object>(
99
- via: IReadonlyRepository<TRelated>,
100
- enrichment: Enrichment,
101
- parents: T[],
102
- sources?: (Row | undefined)[],
103
- ): Promise<void> {
104
- const mapKey = mapKeyName(enrichment.relatedKey);
105
- for (const [index, parent] of parents.entries()) {
106
- const key = this.sourceKey(parent, enrichment.sourceProperty, sources, index);
107
- if (key === undefined || key === null) continue;
108
- const map: Record<string, Scalar | object> = {};
109
- for await (const item of via.read(
110
- new Where(new Operator.Equals(enrichment.relatedKey, this.scalar(key))),
111
- )) {
112
- const row = this.props(item);
113
- const entry = row[mapKey];
114
- if (entry === undefined || entry === null || typeof entry === "object") continue;
115
- map[String(entry)] = enrichment.relatedProperty
116
- ? (row[enrichment.relatedProperty] ?? null)
117
- : Object.fromEntries(
118
- Object.entries(row).filter(
119
- ([name]) => name !== mapKey && name !== enrichment.relatedKey && name !== "Id" && name !== "id",
120
- ),
121
- );
122
- }
123
- Object.assign(parent, { [enrichment.destinationProperty]: map });
124
- }
125
- }
126
-
127
- protected sourceKey(
128
- parent: T,
129
- name: string,
130
- sources: (Row | undefined)[] | undefined,
131
- index: number,
132
- ): Scalar | object | undefined {
133
- const cell = sources?.[index]?.[name];
134
- const raw = cell !== undefined && cell !== null ? cell : this.props(parent)[name];
135
- return this.lookupKey(raw);
136
- }
137
-
138
- protected props = <TItem>(item: TItem): Props => item as never as Props;
139
-
140
- protected keyOf = (key: Scalar | object): string => String(this.lookupKey(key));
141
-
142
- protected lookupKey = (value: Scalar | object | undefined): Scalar | object | undefined => {
143
- if (value === undefined || value === null || typeof value !== "object") return value;
144
- const id = this.props(value).Id ?? this.props(value).id;
145
- return id !== undefined && id !== null && typeof id !== "object" ? id : value;
146
- };
147
-
148
- protected scalar = (value: Scalar | object): Scalar => {
149
- const key = this.lookupKey(value);
150
- return key === null ||
151
- typeof key === "string" ||
152
- typeof key === "number" ||
153
- typeof key === "boolean" ||
154
- typeof key === "bigint"
155
- ? key
156
- : (() => {
157
- throw new DatasourceError("Enrichment key must be a scalar");
158
- })();
159
- };
160
- }
161
-
162
- const mapKeyName = (relatedKey: string): string =>
163
- relatedKey.includes("_") || relatedKey[0] !== relatedKey[0]?.toUpperCase() ? "key" : "Key";
164
-
@@ -1,40 +0,0 @@
1
- import { DatasourceError } from "./DatasourceError.ts";
2
- import { DeleteEnrichmentStrategy } from "./DeleteEnrichmentStrategy.ts";
3
- import type { Enrichment } from "./Enrichment.ts";
4
- import type { ICRUDRepository } from "./ICRUDRepository.ts";
5
- import { UpdateEnrichmentStrategy } from "./UpdateEnrichmentStrategy.ts";
6
-
7
- export class DefaultUpdateEnrichmentStrategy<T> extends UpdateEnrichmentStrategy<T> {
8
- async updateChildren<TChild extends object>(writer: ICRUDRepository<TChild>, enrichment: Enrichment, parent: T): Promise<void> {
9
- const existing = await DeleteEnrichmentStrategy.load(writer, enrichment, parent);
10
- const rows = this.payloadOf<TChild, T>(parent, enrichment.destinationProperty, enrichment);
11
- for (const related of rows) this.stampCell(related, enrichment.relatedKey, this.getCell(parent, enrichment.sourceProperty));
12
- const keys = this.namesOf(writer, rows[0] ?? existing[0] ?? {} as TChild);
13
- const keep = new Set(rows.filter((row) => this.hasKey(row, keys)).map((row) => this.keyOf(row, keys)));
14
- for (const row of existing.filter((row) => !keep.has(this.keyOf(row, keys))))
15
- await writer.delete(row, DeleteEnrichmentStrategy.childrenWhere(writer, enrichment, parent));
16
- for (const related of rows)
17
- this.hasKey(related, keys) && existing.some((row) => this.keyOf(row, keys) === this.keyOf(related, keys))
18
- ? await writer.update(related)
19
- : await writer.create(related);
20
- }
21
-
22
- async updateLinked<TChild extends object>(writer: ICRUDRepository<TChild>, enrichment: Enrichment, parent: T): Promise<void> {
23
- const association = enrichment.association;
24
- if (!association) throw new DatasourceError("Missing association");
25
- const parentKey = this.requiredKey(parent, enrichment);
26
- const existing = await DeleteEnrichmentStrategy.loadLinks(writer, association.parent, parentKey);
27
- const wanted = this.relatedIds(parent, enrichment);
28
- const keep = new Set(wanted.map((id) => String(id)));
29
- for (const row of existing) {
30
- const id = this.getCell(row, association.related);
31
- if (this.presentCell(id) && keep.has(String(id))) continue;
32
- if (!this.presentCell(id)) continue;
33
- await writer.delete(row, this.linkWhere(association, parentKey, id));
34
- }
35
- for (const id of wanted) {
36
- if (existing.some((row) => String(this.getCell(row, association.related) ?? "") === String(id))) continue;
37
- await writer.create({ [association.parent]: parentKey, [association.related]: id } as TChild);
38
- }
39
- }
40
- }
@@ -1,151 +0,0 @@
1
- import { CascadeDeleteEnrichmentStrategy } from "./CascadeDeleteEnrichmentStrategy.ts";
2
- import type { CreateEnrichmentStrategy } from "./CreateEnrichmentStrategy.ts";
3
- import { DatasourceError } from "./DatasourceError.ts";
4
- import { DefaultCreateEnrichmentStrategy } from "./DefaultCreateEnrichmentStrategy.ts";
5
- import { EnrichmentPropertyType } from "./EnrichmentPropertyType.ts";
6
- import { DefaultUpdateEnrichmentStrategy } from "./DefaultUpdateEnrichmentStrategy.ts";
7
- import type { ICRUDRepository } from "./ICRUDRepository.ts";
8
- import { enrichmentsOf } from "./ReadonlyRepository.ts";
9
- import type { IRepositoryTree } from "./IRepositoryTree.ts";
10
- import type { IWriteEnrichmentStrategy } from "./IWriteEnrichmentStrategy.ts";
11
- import type { StoredEnrichment } from "./StoredEnrichment.ts";
12
- import type { Scalar } from "./builders/Scalar.ts";
13
- import type { DeleteEnrichmentStrategy } from "./DeleteEnrichmentStrategy.ts";
14
- import type { UpdateEnrichmentStrategy } from "./UpdateEnrichmentStrategy.ts";
15
- import type { WriteMode } from "./WriteMode.ts";
16
-
17
- const unloaded = <TParent>(parent: TParent, into: string): boolean => {
18
- const value = (parent as never as Record<string, Scalar | object>)[into];
19
- return value === undefined || value === null;
20
- };
21
-
22
- const childWriter = (entry: StoredEnrichment, into: string): ICRUDRepository<object> => {
23
- if (entry.persist) return entry.persist;
24
- throw new DatasourceError(`Deep write requires a CRUD repository for "${into}"`);
25
- };
26
-
27
- const linkWriter = (entry: StoredEnrichment, into: string): ICRUDRepository<object> => {
28
- if (entry.link) return entry.link;
29
- throw new DatasourceError(`Deep write requires a CRUD repository for "${into}"`);
30
- };
31
-
32
- const dispatch = (mode: string, runs: Record<WriteMode, () => Promise<void>>): Promise<void> =>
33
- (runs[mode as WriteMode] ??
34
- (() => {
35
- throw new DatasourceError("Unknown persist mode");
36
- }))();
37
-
38
- export class DefaultWriteEnrichmentStrategy<T> implements IWriteEnrichmentStrategy<T> {
39
- protected skipUnloaded = false;
40
- readonly useTransaction: boolean;
41
- private readonly createStrategy: CreateEnrichmentStrategy<T>;
42
- private readonly deleteStrategy: DeleteEnrichmentStrategy<T>;
43
- private readonly updateStrategy: UpdateEnrichmentStrategy<T>;
44
-
45
- constructor(
46
- deleteStrategy: DeleteEnrichmentStrategy<T> = new CascadeDeleteEnrichmentStrategy<T>(),
47
- updateStrategy: UpdateEnrichmentStrategy<T> = new DefaultUpdateEnrichmentStrategy<T>(),
48
- createStrategy: CreateEnrichmentStrategy<T> = new DefaultCreateEnrichmentStrategy<T>(),
49
- useTransaction = false,
50
- ) {
51
- this.deleteStrategy = deleteStrategy;
52
- this.updateStrategy = updateStrategy;
53
- this.createStrategy = createStrategy;
54
- this.useTransaction = useTransaction;
55
- }
56
-
57
- persist = async (tree: IRepositoryTree, items: T[], mode: WriteMode): Promise<void> => {
58
- await this.walk(tree.parent.value, items, mode);
59
- };
60
-
61
- persistBulk = async (tree: IRepositoryTree, items: T[], mode: WriteMode): Promise<void> => {
62
- if (mode === "delete") return this.persist(tree, items, mode);
63
- await this.walkBulk(tree.parent.value, items, mode);
64
- };
65
-
66
- private walk = async (host: object, parents: T[], mode: WriteMode): Promise<void> => {
67
- const entries = enrichmentsOf(host);
68
- if (!entries) return;
69
- for (const entry of entries) await this.persistEntry(entry, parents, mode);
70
- };
71
-
72
- private walkBulk = async (host: object, parents: T[], mode: WriteMode): Promise<void> => {
73
- const entries = enrichmentsOf(host);
74
- if (!entries) return;
75
- for (const entry of entries) await this.persistEntryBulk(entry, parents, mode);
76
- };
77
-
78
- private persistEntryBulk = async (
79
- entry: StoredEnrichment,
80
- parents: T[],
81
- mode: WriteMode,
82
- ): Promise<void> => {
83
- const enrichment = entry.enrichment;
84
- const type = enrichment.type ?? EnrichmentPropertyType.Object;
85
- if (type === EnrichmentPropertyType.Custom)
86
- throw new DatasourceError(`Unsupported enrichment type "${type}"`);
87
- if (enrichment.association) {
88
- const writer = linkWriter(entry, enrichment.destinationProperty);
89
- for (const parent of parents) {
90
- if (this.skip(parent, enrichment.destinationProperty, mode)) continue;
91
- await dispatch(mode, {
92
- create: () => this.createStrategy.createLinked(writer, enrichment, parent),
93
- update: () => this.updateStrategy.updateLinked(writer, enrichment, parent),
94
- delete: () => this.deleteStrategy.deleteLinked(writer, enrichment, parent),
95
- });
96
- }
97
- return;
98
- }
99
- if (type === EnrichmentPropertyType.List && enrichment.relatedProperty) return;
100
- if (type !== EnrichmentPropertyType.List && type !== EnrichmentPropertyType.Dictionary) return;
101
- const writer = childWriter(entry, enrichment.destinationProperty);
102
- const ready = parents.filter((parent) => !this.skip(parent, enrichment.destinationProperty, mode));
103
- const children = ready.flatMap((parent) => this.createStrategy.collectChildren(writer, enrichment, parent));
104
- if (children.length === 0) return;
105
- const bulk = writer as ICRUDRepository<object> & { createBulk?: (items: object[]) => Promise<object[]>; updateBulk?: (items: object[]) => Promise<unknown> };
106
- if (mode === "create") {
107
- if (bulk.createBulk) await bulk.createBulk(children);
108
- else for (const child of children) await writer.create(child);
109
- return;
110
- }
111
- if (bulk.updateBulk) await bulk.updateBulk(children);
112
- else for (const child of children) await writer.update(child);
113
- };
114
-
115
- private persistEntry = async (
116
- entry: StoredEnrichment,
117
- parents: T[],
118
- mode: WriteMode,
119
- ): Promise<void> => {
120
- const enrichment = entry.enrichment;
121
- const type = enrichment.type ?? EnrichmentPropertyType.Object;
122
- if (type === EnrichmentPropertyType.Custom)
123
- throw new DatasourceError(`Unsupported enrichment type "${type}"`);
124
- if (enrichment.association) {
125
- const writer = linkWriter(entry, enrichment.destinationProperty);
126
- for (const parent of parents) {
127
- if (this.skip(parent, enrichment.destinationProperty, mode)) continue;
128
- await dispatch(mode, {
129
- create: () => this.createStrategy.createLinked(writer, enrichment, parent),
130
- update: () => this.updateStrategy.updateLinked(writer, enrichment, parent),
131
- delete: () => this.deleteStrategy.deleteLinked(writer, enrichment, parent),
132
- });
133
- }
134
- return;
135
- }
136
- if (type === EnrichmentPropertyType.List && enrichment.relatedProperty) return;
137
- if (type !== EnrichmentPropertyType.List && type !== EnrichmentPropertyType.Dictionary) return;
138
- const writer = childWriter(entry, enrichment.destinationProperty);
139
- for (const parent of parents) {
140
- if (this.skip(parent, enrichment.destinationProperty, mode)) continue;
141
- await dispatch(mode, {
142
- create: () => this.createStrategy.createChildren(writer, enrichment, parent),
143
- update: () => this.updateStrategy.updateChildren(writer, enrichment, parent),
144
- delete: () => this.deleteStrategy.deleteChildren(writer, enrichment, parent, async () => {}),
145
- });
146
- }
147
- };
148
-
149
- private skip = (parent: T, into: string, mode: string): boolean =>
150
- this.skipUnloaded && mode !== "delete" && unloaded(parent, into);
151
- }
@@ -1,56 +0,0 @@
1
- import type { Enrichment } from "./Enrichment.ts";
2
- import type { ICRUDRepository } from "./ICRUDRepository.ts";
3
- import type { Scalar } from "./builders/Scalar.ts";
4
- import { Operator, Where } from "./statements/index.ts";
5
-
6
- type Props = Record<string, Scalar | object>;
7
-
8
- const get = <TItem>(item: TItem, name: string): Scalar | object | undefined =>
9
- (item as never as Props)[name];
10
-
11
- export abstract class DeleteEnrichmentStrategy<T> {
12
- abstract deleteChildren<TChild extends object>(
13
- writer: ICRUDRepository<TChild>,
14
- enrichment: Enrichment,
15
- parent: T,
16
- deleteNested: (rows: TChild[]) => Promise<void>,
17
- ): Promise<void>;
18
-
19
- abstract deleteLinked<TChild extends object>(writer: ICRUDRepository<TChild>, enrichment: Enrichment, parent: T): Promise<void>;
20
-
21
- static load = async <TParent, TChild extends object>(
22
- writer: ICRUDRepository<TChild>,
23
- enrichment: Enrichment,
24
- parent: TParent,
25
- ): Promise<TChild[]> => {
26
- const key = get(parent, enrichment.sourceProperty);
27
- if (key === undefined || key === null || typeof key === "object") return [];
28
- const items: TChild[] = [];
29
- for await (const item of writer.read(new Where(new Operator.Equals(enrichment.relatedKey, key))))
30
- items.push(item);
31
- return items;
32
- };
33
-
34
- static childrenWhere = <TParent, TChild extends object>(
35
- writer: ICRUDRepository<TChild>,
36
- enrichment: Enrichment,
37
- parent: TParent,
38
- ): Where | undefined => {
39
- if (writer.ids.length > 0) return undefined;
40
- const key = get(parent, enrichment.sourceProperty);
41
- return key === undefined || key === null || typeof key === "object"
42
- ? undefined
43
- : new Where(new Operator.Equals(enrichment.relatedKey, key));
44
- };
45
-
46
- static loadLinks = async <TChild extends object>(
47
- writer: ICRUDRepository<TChild>,
48
- column: string,
49
- key: Scalar,
50
- ): Promise<TChild[]> => {
51
- const items: TChild[] = [];
52
- for await (const item of writer.read(new Where(new Operator.Equals(column, key))))
53
- items.push(item);
54
- return items;
55
- };
56
- };
@@ -1,97 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import { createRequire, registerHooks } from "node:module";
3
- import { tmpdir } from "node:os";
4
- import { fileURLToPath, pathToFileURL } from "node:url";
5
- import type { IDriver } from "./IDriver.ts";
6
- import type { ProviderCatalog } from "./ProviderCatalog.ts";
7
- import { ProviderNotInstalledError } from "./ProviderNotInstalledError.ts";
8
-
9
- type DriverCtor = new () => IDriver;
10
- type DriverModule = Record<string, DriverCtor>;
11
- type TypeScript = {
12
- transpileModule: (
13
- source: string,
14
- options: {
15
- compilerOptions: { module: number; target: number };
16
- fileName: string;
17
- },
18
- ) => { outputText: string };
19
- ModuleKind: { ESNext: number };
20
- ScriptTarget: { ES2022: number };
21
- };
22
-
23
- const require = createRequire(import.meta.url);
24
- const virtual = new Map<string, string>();
25
- const virtualBySource = new Map<string, string>();
26
- let typeScriptHook = false;
27
- let compiling = false;
28
- let nextVirtual = 0;
29
-
30
- const installTypeScriptHook = (): void => {
31
- if (typeScriptHook) return;
32
- const typescript = require("typescript") as TypeScript;
33
- /* v8 ignore start */
34
- registerHooks({
35
- resolve: (specifier, context, nextResolve) => {
36
- const parentURL = context.parentURL ? virtual.get(context.parentURL) ?? context.parentURL : undefined;
37
- const resolved = nextResolve(specifier, parentURL ? { ...context, parentURL } : context);
38
- /* v8 ignore next */
39
- if (!compiling || !resolved.url.endsWith(".ts")) return resolved;
40
- const existing = virtualBySource.get(resolved.url);
41
- /* v8 ignore next */
42
- if (existing) return { url: existing, shortCircuit: true };
43
- const url = pathToFileURL(`${tmpdir()}/datasources-plugin-${nextVirtual++}.mjs`).href;
44
- virtual.set(url, resolved.url);
45
- virtualBySource.set(resolved.url, url);
46
- return { url, shortCircuit: true };
47
- },
48
- load: (url, context, nextLoad) => {
49
- const original = virtual.get(url) ?? (compiling && url.endsWith(".ts") ? url : undefined);
50
- /* v8 ignore next */
51
- if (!original) return nextLoad(url, context);
52
- const filename = fileURLToPath(original);
53
- const source = typescript.transpileModule(readFileSync(filename, "utf8"), {
54
- compilerOptions: {
55
- module: typescript.ModuleKind.ESNext,
56
- target: typescript.ScriptTarget.ES2022,
57
- },
58
- fileName: filename,
59
- }).outputText;
60
- return { format: "module", source, shortCircuit: true };
61
- },
62
- });
63
- /* v8 ignore stop */
64
- typeScriptHook = true;
65
- };
66
-
67
- const instantiate = (catalog: ProviderCatalog): IDriver => {
68
- compiling = true;
69
- try {
70
- return instantiateLoaded(catalog);
71
- } finally {
72
- compiling = false;
73
- }
74
- };
75
-
76
- const instantiateLoaded = (catalog: ProviderCatalog): IDriver => {
77
- const loaded = require(catalog.location) as DriverModule;
78
- const Type = loaded[catalog.module];
79
- if (typeof Type !== "function") throw new ProviderNotInstalledError(catalog.name);
80
- return new Type();
81
- };
82
-
83
- export class DriverLoader {
84
- static load = (catalog: ProviderCatalog): IDriver => {
85
- try {
86
- return instantiate(catalog);
87
- } catch (error) {
88
- if (error instanceof ProviderNotInstalledError) throw error;
89
- try {
90
- installTypeScriptHook();
91
- return instantiate(catalog);
92
- } catch {
93
- throw new ProviderNotInstalledError(catalog.name);
94
- }
95
- }
96
- };
97
- }
package/src/Enrichment.ts DELETED
@@ -1,15 +0,0 @@
1
- import type { EnrichmentPropertyType } from "./EnrichmentPropertyType.ts";
2
-
3
- export type Association = {
4
- parent: string;
5
- related: string;
6
- };
7
-
8
- export type Enrichment = {
9
- destinationProperty: string;
10
- sourceProperty: string;
11
- relatedKey: string;
12
- relatedProperty?: string;
13
- type?: EnrichmentPropertyType;
14
- association?: Association;
15
- };
@@ -1,9 +0,0 @@
1
- export const EnrichmentPropertyType = {
2
- Object: "object",
3
- List: "list",
4
- Dictionary: "dictionary",
5
- Custom: "custom",
6
- } as const;
7
-
8
- export type EnrichmentPropertyType =
9
- (typeof EnrichmentPropertyType)[keyof typeof EnrichmentPropertyType];
@@ -1,79 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { CommandMiddlewareHost } from "./CommandMiddlewareHost.ts";
3
- import { ExpectConsoleMiddleware, consoleSignature } from "./ExpectConsoleMiddleware.ts";
4
-
5
- const now = () => new Date("2026-08-28T01:54:12.101Z");
6
-
7
- describe("ExpectConsoleMiddleware", () => {
8
- it("matches the transcript and drops the finish duration", async () => {
9
- const middleware = new ExpectConsoleMiddleware(
10
- [
11
- "[2026-08-28T01:54:12.101Z]-[datasource][Start]-[SELECT 1]",
12
- "[2026-08-28T01:54:12.101Z]-[datasource][Request]-[{id: 1}]",
13
- "[2026-08-28T01:54:12.101Z]-[datasource][Finish]-[SELECT 1]",
14
- "[2026-08-28T01:54:12.101Z]-[datasource][AfterCommand]-[{id: 1}]",
15
- ],
16
- now,
17
- );
18
- const host = new CommandMiddlewareHost();
19
- host.addMiddleware(middleware);
20
- await host.run("SELECT 1", [{ name: "id", value: 1 }], async () => ({
21
- value: 1,
22
- rows: [{ id: 1 }],
23
- }));
24
- middleware.complete();
25
- expect(consoleSignature("[2026-08-28T01:54:12.101Z]-[datasource][Finish]-[SELECT 1] 2ms")).toBe(
26
- "[2026-08-28T01:54:12.101Z]-[datasource][Finish]-[SELECT 1]",
27
- );
28
- expect(consoleSignature("[2026-08-28T01:54:12.101Z]-[datasource][Start]-[SELECT 1]")).toBe(
29
- "[2026-08-28T01:54:12.101Z]-[datasource][Start]-[SELECT 1]",
30
- );
31
- expect(consoleSignature("[2026-08-28T01:54:12.101Z]-[datasource][Finish]-[SELECT 1] 3μs")).toBe(
32
- "[2026-08-28T01:54:12.101Z]-[datasource][Finish]-[SELECT 1]",
33
- );
34
- });
35
-
36
- it("applies a custom line check", async () => {
37
- const normalize = (line: string) => consoleSignature(line).replaceAll("2026-08-28T01:54:12.101Z", "<date>");
38
- const middleware = new ExpectConsoleMiddleware(
39
- [
40
- "[<date>]-[datasource][Start]-[SELECT 1]",
41
- "[<date>]-[datasource][Request]-[{id: 1}]",
42
- "[<date>]-[datasource][Finish]-[SELECT 1]",
43
- "[<date>]-[datasource][AfterCommand]-[{id: 1}]",
44
- ],
45
- now,
46
- normalize,
47
- );
48
- const host = new CommandMiddlewareHost();
49
- host.addMiddleware(middleware);
50
- await host.run("SELECT 1", [{ name: "id", value: 1 }], async () => ({
51
- value: 1,
52
- rows: [{ id: 1 }],
53
- }));
54
- middleware.complete();
55
- });
56
-
57
- it("rejects a different line and a short transcript", async () => {
58
- const host = new CommandMiddlewareHost();
59
- const mismatch = new ExpectConsoleMiddleware(["[nope]"], now);
60
- host.addMiddleware(mismatch);
61
- await expect(
62
- host.run("SELECT 1", [{ name: "id", value: 1 }], async () => ({
63
- value: 1,
64
- rows: [{ id: 1 }],
65
- })),
66
- ).rejects.toThrow(/console mismatch at 0/);
67
- expect(() => new ExpectConsoleMiddleware(["[missing]"], now).complete()).toThrow(
68
- /actual: <missing>/,
69
- );
70
- const extraHost = new CommandMiddlewareHost();
71
- extraHost.addMiddleware(new ExpectConsoleMiddleware(
72
- ["[2026-08-28T01:54:12.101Z]-[datasource][Start]-[SELECT 1]"],
73
- now,
74
- ));
75
- await expect(
76
- extraHost.run("SELECT 1", undefined, async () => ({ value: null, rows: [] })),
77
- ).rejects.toThrow(/<missing>/);
78
- });
79
- });
@@ -1,47 +0,0 @@
1
- import { ConsoleCommandMiddleware } from "./ConsoleCommandMiddleware.ts";
2
- import type { ICommandMiddleware } from "./ICommandMiddleware.ts";
3
- import type { Parameter } from "./Parameter.ts";
4
- import type { Row } from "./Row.ts";
5
-
6
- export const consoleSignature = (line: string): string => {
7
- const duration = line.lastIndexOf("] ");
8
- return duration >= 0 && (line.endsWith("ms") || line.endsWith("μs"))
9
- ? line.slice(0, duration + 1)
10
- : line;
11
- };
12
-
13
- export class ExpectConsoleMiddleware implements ICommandMiddleware {
14
- private readonly inner: ConsoleCommandMiddleware;
15
- private index = 0;
16
-
17
- constructor(
18
- private readonly expected: readonly string[],
19
- now: () => Date,
20
- private readonly normalize: (line: string) => string = consoleSignature,
21
- ) {
22
- this.inner = new ConsoleCommandMiddleware((line) => this.check(line), now, { isVerbose: "true" });
23
- }
24
-
25
- beforeCommand = (text: string, params?: ReadonlyArray<Parameter>) =>
26
- this.inner.beforeCommand(text, params);
27
-
28
- afterCommand = (
29
- text: string,
30
- params: ReadonlyArray<Parameter> | undefined,
31
- results: ReadonlyArray<Row>,
32
- elapsedMs: number,
33
- error?: Error,
34
- ) => this.inner.afterCommand(text, params, results, elapsedMs, error);
35
-
36
- complete = (): void => {
37
- if (this.index !== this.expected.length)
38
- throw new Error(`console mismatch at ${this.index}\nexpected: ${this.expected[this.index]}\nactual: <missing>`);
39
- };
40
-
41
- private check = (line: string): void => {
42
- const actual = this.normalize(line);
43
- if (this.index >= this.expected.length || actual !== this.expected[this.index])
44
- throw new Error(`console mismatch at ${this.index}\nexpected: ${this.index < this.expected.length ? this.expected[this.index] : "<missing>"}\nactual: ${actual}`);
45
- this.index++;
46
- };
47
- }