@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,485 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { MemoryDriver } from "@datasources/memory";
3
- import { collectAsync } from "./collectAsync.ts";
4
- import { BulkCRUDRepository } from "./BulkCRUDRepository.ts";
5
- import { CascadeDeleteEnrichmentStrategy } from "./CascadeDeleteEnrichmentStrategy.ts";
6
- import { CascadeDeleteUpdateEnrichmentStrategy } from "./CascadeDeleteUpdateEnrichmentStrategy.ts";
7
- import { CRUDRepository } from "./CRUDRepository.ts";
8
- import { DefaultReadonlyEnrichmentStrategy } from "./DefaultReadonlyEnrichmentStrategy.ts";
9
- import { DefaultCreateEnrichmentStrategy } from "./DefaultCreateEnrichmentStrategy.ts";
10
- import { DefaultUpdateEnrichmentStrategy } from "./DefaultUpdateEnrichmentStrategy.ts";
11
- import { DefaultWriteEnrichmentStrategy } from "./DefaultWriteEnrichmentStrategy.ts";
12
- import { LazyWriteEnrichmentStrategy } from "./LazyWriteEnrichmentStrategy.ts";
13
- import { DeleteEnrichmentStrategy } from "./DeleteEnrichmentStrategy.ts";
14
- import { HashsetOptimizedReadonlyEnrichmentStrategy } from "./HashsetOptimizedReadonlyEnrichmentStrategy.ts";
15
- import { NestedToObjectEnrichmentStrategy } from "./NestedToObjectEnrichmentStrategy.ts";
16
- import { ReadonlyRepository } from "./ReadonlyRepository.ts";
17
- import { RepositoryTree } from "./RepositoryTree.ts";
18
- import { RepositoryTreeNode } from "./RepositoryTreeNode.ts";
19
- import { BatchCommandIBulkWriteStrategy } from "./BatchCommandIBulkWriteStrategy.ts";
20
- import { SingleCommandIBulkWriteStrategy } from "./SingleCommandIBulkWriteStrategy.ts";
21
- import { StoredProcedureBulkWriteStrategy } from "./StoredProcedureBulkWriteStrategy.ts";
22
- import type { Cells } from "./converters/Cell.ts";
23
- import type { Scalar } from "./builders/Scalar.ts";
24
- import { TypeConverter } from "./converters/TypeConverter.ts";
25
- import { MockCommand } from "./mocks/mock-command.ts";
26
- import { MockConnection } from "./mocks/mock-connection.ts";
27
- import { MockReader } from "./mocks/mock-reader.ts";
28
- import { n } from "./statements/Native.ts";
29
- import { ExecuteStoredProcedureStatement } from "./statements/ExecuteStoredProcedureStatement.ts";
30
- import { WhereText } from "./statements/WhereText.ts";
31
- import { RowTypeConverter } from "./converters/RowTypeConverter.ts";
32
- import type { WriteMode } from "./WriteMode.ts";
33
-
34
- class Item {
35
- id = 0;
36
- name = "";
37
- }
38
-
39
- type Bag = Record<string, Scalar | object>;
40
-
41
- class Plain extends TypeConverter<Item, Cells> {
42
- convert = (row: Cells): Item => Object.assign(new Item(), row);
43
- reverseConvert = (row: Item): Cells => ({ id: row.id, name: row.name });
44
- }
45
-
46
- class OpenUpdate extends DefaultUpdateEnrichmentStrategy<Item> {
47
- stamp = <TItem extends object>(related: TItem, by: string, key: Scalar | object | undefined): void =>
48
- this.stampCell(related, by, key);
49
-
50
- payload = <TParent extends object>(parent: TParent, into: string): object[] => this.payloadOf(parent, into);
51
-
52
- key = <TItem extends object>(item: TItem, keys: readonly string[]): string => this.keyOf(item, keys);
53
- }
54
-
55
- class OpenCreate extends DefaultCreateEnrichmentStrategy<Item> {
56
- payload = <TParent extends object>(parent: TParent, into: string): object[] => this.payloadOf(parent, into);
57
- }
58
-
59
- class DropId extends TypeConverter<Item, Cells> {
60
- convert = (row: Cells): Item => Object.assign(new Item(), row);
61
- reverseConvert = (): Cells => ({ name: "a" });
62
- }
63
-
64
- const mock = (rows: Cells[] = []) => {
65
- const connection = new MockConnection();
66
- const command = new MockCommand(connection);
67
- command.reader = new MockReader(rows);
68
- command.response = { result: 9, rowsAffected: 1 };
69
- connection.command = command;
70
- return { connection, command };
71
- };
72
-
73
- const enrichment = (into: string, extra: object = {}) =>
74
- ({ destinationProperty: into, sourceProperty: "id", relatedKey: "parent_id", type: "list", ...extra });
75
-
76
- describe("statement and repository edges", () => {
77
- it("names a native fragment", () => {
78
- expect(n("select 1").text).toBe("select 1");
79
- });
80
-
81
- it("reads without a connection and without statements", async () => {
82
- const repo = new ReadonlyRepository();
83
- await expect(collectAsync(repo.read(new WhereText("id = $id")))).rejects.toThrow();
84
- await expect(collectAsync(repo.read())).rejects.toThrow();
85
- });
86
-
87
- it("converts with a plain object converter", async () => {
88
- const { connection, command } = mock([{ generated: 9 }]);
89
- const repo = new CRUDRepository<Item>(connection, {
90
- type: Item,
91
- entity: "items",
92
- objectConverter: new Plain(),
93
- });
94
- expect(await collectAsync(repo.read())).toHaveLength(1);
95
- const converted = new ReadonlyRepository<Item>(connection, {
96
- type: Item,
97
- entity: "items",
98
- objectConverter: new Plain(),
99
- rowConverter: new RowTypeConverter({}),
100
- });
101
- command.reader = new MockReader([{ id: 1, name: "a" }]);
102
- expect(await collectAsync(converted.read())).toHaveLength(1);
103
- command.reader = new MockReader([]);
104
- await expect(
105
- collectAsync(converted.read(new ExecuteStoredProcedureStatement("save_item", []))),
106
- ).resolves.toEqual([]);
107
- command.reader = new MockReader([{ generated: 9 }]);
108
- const created = await repo.create(Object.assign(new Item(), { name: "a" }));
109
- expect(created.id).toBe(9);
110
- });
111
-
112
- it("bulk write covers transaction, strategy position, and where text", async () => {
113
- const { connection, command } = mock();
114
- const strategy = new SingleCommandIBulkWriteStrategy<Item>();
115
- const transactional = new BulkCRUDRepository<Item>(
116
- connection,
117
- { type: Item, entity: "items", write: { useTransaction: true, persist: async () => {} } },
118
- strategy,
119
- );
120
- const created = await transactional.createBulk([Object.assign(new Item(), { name: "a" })]);
121
- expect(created).toHaveLength(1);
122
- expect(connection.startTransactionCalls).toBe(1);
123
-
124
- expect(() => new BulkCRUDRepository<Item>(connection, strategy)).toThrow();
125
-
126
- const open = new MemoryDriver().connection();
127
- await open.open();
128
- const repo = new BulkCRUDRepository<Item>(open, { type: Item, entity: "items", ids: [] });
129
- await repo.create(Object.assign(new Item(), { name: "a" }));
130
- await repo.deleteBulk([Object.assign(new Item(), { name: "a" })], new WhereText("id = $id"));
131
- await repo.deleteBulk([new Item()], new WhereText("1 = 1"));
132
-
133
- const batch = new BatchCommandIBulkWriteStrategy<Item>();
134
- const listedRepo = new BulkCRUDRepository<Item>(connection, { type: Item, entity: "items", ids: [] }, batch);
135
- command.executeCalls = [];
136
- await listedRepo.deleteBulk([Object.assign(new Item(), { name: "a" })], new WhereText("id = $id"));
137
- expect(command.executeCalls[0]?.text).toContain("$id");
138
- command.executeCalls = [];
139
- await listedRepo.deleteBulk([new Item()], new WhereText("1 = 1"));
140
- expect(command.executeCalls[0]?.parameters).toEqual([]);
141
- command.executeCalls = [];
142
- await listedRepo.deleteBulk([new Item()]);
143
- expect(command.executeCalls[0]?.text).toContain("1 = 1");
144
- expect(await repo.createBulk([new Item()])).toEqual([new Item()]);
145
- const both = new BulkCRUDRepository<Item>(
146
- connection,
147
- { type: Item, entity: "items", ids: ["id", "name"] },
148
- new BatchCommandIBulkWriteStrategy<Item>(),
149
- );
150
- await expect(both.updateBulk([new Item()])).rejects.toThrow(/non-Id field/);
151
- const stored = new StoredProcedureBulkWriteStrategy<Item>("create_item", "update_item", "delete_item");
152
- const wide = new BulkCRUDRepository<Item>(connection, {
153
- type: Item,
154
- entity: "items",
155
- ids: ["id", "name"],
156
- rowConverter: new RowTypeConverter({}),
157
- write: { persist: async () => {} },
158
- }, stored);
159
- command.executeCalls = [];
160
- await wide.createBulk([new Item()]);
161
- expect(String(command.executeCalls[0]?.parameters?.[0]?.value)).toContain('"id":0');
162
- expect(String(command.executeCalls[0]?.parameters?.[0]?.value)).toContain('"name":""');
163
- expect(await wide.createBulk([new Item()])).toEqual([new Item()]);
164
-
165
- const dropped = new BulkCRUDRepository<Item>(
166
- connection,
167
- { type: Item, entity: "items", objectConverter: new DropId() },
168
- new BatchCommandIBulkWriteStrategy<Item>(),
169
- );
170
- command.response = { result: undefined, rowsAffected: 1 };
171
- await expect(dropped.deleteBulk([new Item()])).rejects.toThrow(/id/);
172
-
173
- const plain = new BulkCRUDRepository<Item>(connection, { type: Item, entity: "items" });
174
- command.reader = new MockReader([]);
175
- expect(
176
- await plain.createBulk([Object.assign(new Item(), { id: { nested: true } as unknown as number })]),
177
- ).toEqual([Object.assign(new Item(), { id: { nested: true } as unknown as number })]);
178
- });
179
-
180
- it("create follows enrichment and inserted-id edges", async () => {
181
- const { connection, command } = mock([]);
182
- const writer = new CRUDRepository<Item>(connection, { type: Item, entity: "items" });
183
- const host = new CRUDRepository<Item>(connection, { type: Item, entity: "parents" });
184
- host.addEnriched({ destinationProperty: "Children", sourceProperty: "id", relatedKey: "parent_id", type: "list" }, writer);
185
- const objectId = Object.assign(new Item(), { id: { nested: true } as unknown as number, name: "a" });
186
- expect(await host.create(objectId)).toBe(objectId);
187
- const numeric = Object.assign(new Item(), { name: "b" });
188
- expect(await host.create(numeric)).toBe(numeric);
189
- const wide = new CRUDRepository<Item>(connection, {
190
- type: Item,
191
- entity: "parents",
192
- ids: ["id", "name"],
193
- });
194
- wide.addEnriched({ destinationProperty: "Children", sourceProperty: "id", relatedKey: "parent_id", type: "list" }, writer);
195
- expect(await wide.create(new Item())).toBeInstanceOf(Item);
196
-
197
- command.reader = new MockReader([undefined as unknown as Cells]);
198
- await expect(host.create(new Item())).rejects.toThrow("Reader current must be a row");
199
-
200
- const plainSide = mock([{ id: 9 }]);
201
- const plainRepo = new CRUDRepository<Item>(plainSide.connection, { type: Item, entity: "items" });
202
- expect((await plainRepo.create(Object.assign(new Item(), { name: "a" }))).id).toBe(9);
203
- const convertedSide = mock([{ generated: 4 }]);
204
- const convertedRepo = new CRUDRepository<Item>(convertedSide.connection, {
205
- type: Item,
206
- entity: "items",
207
- objectConverter: new Plain(),
208
- rowConverter: new RowTypeConverter({}),
209
- });
210
- expect((await convertedRepo.create(Object.assign(new Item(), { name: "a" }))).id).toBe(4);
211
- });
212
- });
213
-
214
- describe("enrichment edges", () => {
215
- it("requires a writer and an association", async () => {
216
- const owned = enrichment("Children");
217
- const cascade = new CascadeDeleteEnrichmentStrategy<Bag>();
218
- await expect(cascade.deleteLinked(new CRUDRepository<Item>(mock([]).connection, { entity: "items" }), owned, {})).rejects.toThrow(
219
- "Missing association",
220
- );
221
- const update = new CascadeDeleteUpdateEnrichmentStrategy<Bag>();
222
- await expect(update.updateLinked(new CRUDRepository<Item>(mock([]).connection, { entity: "items" }), owned, {})).rejects.toThrow(
223
- "Missing association",
224
- );
225
- const replacing = new DefaultUpdateEnrichmentStrategy<Bag>();
226
- await expect(replacing.updateLinked(new CRUDRepository<Item>(mock([]).connection, { entity: "items" }), owned, {})).rejects.toThrow(
227
- "Missing association",
228
- );
229
-
230
- const { connection } = mock([]);
231
- const writer = new CRUDRepository<Item>(connection, { type: Item, entity: "items" });
232
- const tags = {
233
- destinationProperty: "Tags",
234
- sourceProperty: "id",
235
- relatedKey: "id",
236
- association: { parent: "parent_id", related: "tag_id" },
237
- };
238
- await cascade.deleteLinked(writer, tags, { id: 0 });
239
- await cascade.deleteLinked(writer, tags, { id: "" });
240
- await expect(DeleteEnrichmentStrategy.load(writer, owned, { id: { nested: true } })).resolves.toEqual([]);
241
-
242
- const host = new CRUDRepository<Item>(connection, { type: Item, entity: "items" });
243
- host.addEnriched({ destinationProperty: "Children", sourceProperty: "id", relatedKey: "parent_id", type: "list" }, writer);
244
- const tree = new RepositoryTree(new RepositoryTreeNode(host, ""));
245
- await expect(
246
- new DefaultWriteEnrichmentStrategy<Item>().persist(tree, [new Item()], "nope" as WriteMode),
247
- ).rejects.toThrow("Unknown persist mode");
248
- await new DefaultWriteEnrichmentStrategy<Item>().persist(
249
- new RepositoryTree(new RepositoryTreeNode({}, "")),
250
- [],
251
- "create",
252
- );
253
-
254
- await new HashsetOptimizedReadonlyEnrichmentStrategy<Item>().apply(
255
- writer,
256
- { destinationProperty: "name", sourceProperty: "missing", relatedKey: "id", relatedProperty: "name" },
257
- [{}],
258
- );
259
- await new NestedToObjectEnrichmentStrategy<Item>({ key: "id", fields: { id: "id" } }).apply(
260
- writer,
261
- { destinationProperty: "name", sourceProperty: "id", relatedKey: "id" },
262
- [],
263
- );
264
- });
265
-
266
- it("walks lookup, link, and replace edges", async () => {
267
- const tags = { destinationProperty: "Tags", sourceProperty: "id", relatedKey: "id", association: { parent: "parent_id", related: "tag_id" } };
268
- const empty = mock([]);
269
- const via = new CRUDRepository<Item>(empty.connection, { type: Item, entity: "tags" });
270
- const lookup = new DefaultReadonlyEnrichmentStrategy<Item>();
271
- await lookup.apply(via, { destinationProperty: "name", sourceProperty: "id", relatedKey: "id" }, [{ id: null }, { id: 1 }]);
272
- await lookup.apply(via, { destinationProperty: "Children", sourceProperty: "id", relatedKey: "parent_id", type: "list" }, [{ id: null }, {}]);
273
- await expect(lookup.applyLinked(via, via, { destinationProperty: "Tags", sourceProperty: "id", relatedKey: "id" }, [{ id: 1 }])).rejects.toThrow(
274
- "Missing association",
275
- );
276
- await lookup.applyLinked(via, via, tags, [{ id: null }]);
277
- const linkSide = mock([{ tag_id: null }, { tag_id: { nested: true } as never }, { tag_id: 2 }]);
278
- const linkRepo = new CRUDRepository<Item>(linkSide.connection, { entity: "links" });
279
- await lookup.applyLinked(via, linkRepo, tags, [{ id: 1 }]);
280
-
281
- const hash = new HashsetOptimizedReadonlyEnrichmentStrategy<Item>();
282
- await hash.apply(via, { destinationProperty: "name", sourceProperty: "id", relatedKey: "id", relatedProperty: "name", type: "list" }, [{}]);
283
- const named = mock([{ id: 1, name: "a" }]);
284
- const namedRepo = new CRUDRepository<Item>(named.connection, { type: Item, entity: "tags" });
285
- await hash.apply(namedRepo, { destinationProperty: "name", sourceProperty: "id", relatedKey: "id", relatedProperty: "name" }, [{ id: 1 }, {}]);
286
- const many = mock([{ parent_id: 1, name: "a" }]);
287
- const manyRepo = new CRUDRepository<Item>(many.connection, { type: Item, entity: "children" });
288
- await hash.apply(manyRepo, { destinationProperty: "Children", sourceProperty: "id", relatedKey: "parent_id", type: "list" }, [{ id: 1 }, { id: null }]);
289
-
290
- const children = { destinationProperty: "Children", sourceProperty: "id", relatedKey: "parent_id", type: "list" };
291
- const quiet = mock([]);
292
- const writer = new CRUDRepository<Item>(quiet.connection, { type: Item, entity: "children", ids: ["id"] });
293
- const replacing = new DefaultUpdateEnrichmentStrategy<Bag>();
294
- await replacing.updateChildren(writer, children, { id: 1 });
295
- const existing = mock([
296
- { id: 1, parent_id: 1, name: "old" },
297
- { id: 9, parent_id: 1, name: "gone" },
298
- ]);
299
- const existingRepo = new CRUDRepository<Item>(existing.connection, { type: Item, entity: "children", ids: ["id"] });
300
- await replacing.updateChildren(existingRepo, children, {
301
- id: 1,
302
- Children: [{ id: 1, name: "kept" }, { name: "fresh" }, null, "skip"],
303
- });
304
-
305
- const linkedRows = mock([{ tag_id: 0 }, { tag_id: 2 }, {}]);
306
- const linkWriter = new CRUDRepository<Item>(linkedRows.connection, { entity: "links", ids: ["id"] });
307
- await replacing.updateLinked(linkWriter, tags, { id: 1, Tags: [{ id: 2 }, { id: 2 }, { id: 3 }] });
308
- await expect(new DefaultCreateEnrichmentStrategy<Bag>().createLinked(writer, { destinationProperty: "Tags", sourceProperty: "id", relatedKey: "id" }, { id: 1 })).rejects.toThrow(
309
- "Missing association",
310
- );
311
- const noIds = new CRUDRepository<Item>(mock([]).connection, { entity: "children", ids: [] });
312
- await replacing.updateChildren(noIds, children, {
313
- id: 1,
314
- Children: [{ name: "a" }],
315
- });
316
- const creating = new DefaultCreateEnrichmentStrategy<Bag>();
317
- await expect(creating.createLinked(writer, tags, { id: 0, Tags: [{ id: 1 }] })).rejects.toThrow(/requires/);
318
- await expect(creating.createLinked(writer, tags, { id: 1, Tags: [{ id: 0 }] })).rejects.toThrow(/requires/);
319
-
320
- const open = new OpenUpdate();
321
- expect(open.key({ name: "a" }, ["missing"])).toBe("");
322
- expect(open.key({ id: 5 }, ["id"])).toBe("5");
323
- expect(open.key({ id: null as unknown as number }, ["id"])).toBe("");
324
- expect(open["requiredKey"]({ id: 1 }, {
325
- destinationProperty: "Tags",
326
- sourceProperty: "id",
327
- relatedKey: "id",
328
- })).toBe(1);
329
- expect(() =>
330
- open["requiredKey"]({ id: 0 }, {
331
- destinationProperty: "Tags",
332
- sourceProperty: "id",
333
- relatedKey: "id",
334
- }),
335
- ).toThrow(/requires/);
336
- open.stamp({ parent: null as unknown as object }, "parent", 8);
337
- expect(open.payload({ Children: { not: "array" } }, "Children")).toEqual([]);
338
- expect(open.payload({ Children: "text" }, "Children")).toEqual([]);
339
- const creatingOpen = new OpenCreate();
340
- expect(creatingOpen.payload({ Children: { not: "array" } }, "Children")).toEqual([]);
341
- expect(creatingOpen.payload({ Children: [null, "skip", { id: 1n }] }, "Children")).toEqual([{ id: 1n }]);
342
- const stamped = { parent: { Id: 0 } };
343
- creatingOpen["stampCell"](stamped, "parent", 9);
344
- expect(stamped.parent.Id).toBe(9);
345
- const createSnake = { parent: { name: "a" } };
346
- creatingOpen["stampCell"](createSnake, "parent", 5);
347
- expect((createSnake.parent as { id?: number }).id).toBe(5);
348
- const createFlat = { parent_id: 0 };
349
- creatingOpen["stampCell"](createFlat, "parent_id", 6);
350
- expect(createFlat.parent_id).toBe(6);
351
- creatingOpen["stampCell"](createFlat, "parent_id", undefined);
352
- creatingOpen["stampCell"](createFlat, "parent_id", null);
353
- creatingOpen["stampCell"](createFlat, "parent_id", { nested: true });
354
- creatingOpen["stampCell"](createFlat, "parent_id", []);
355
- expect(open["namesOf"]({ ids: [] } as never, { id: 1, name: "a" })).toEqual(["id"]);
356
- expect(open["namesOf"]({ ids: ["id"] } as never, { id: 1 })).toEqual(["id"]);
357
- expect(() =>
358
- creatingOpen["relatedIds"]({ Tags: [{ id: 0 }] }, {
359
- destinationProperty: "Tags",
360
- sourceProperty: "id",
361
- relatedKey: "id",
362
- }),
363
- ).toThrow(/requires/);
364
- expect(() =>
365
- creatingOpen["relatedIds"]({ Tags: [{ id: 0n }] }, {
366
- destinationProperty: "Tags",
367
- sourceProperty: "id",
368
- relatedKey: "id",
369
- }),
370
- ).toThrow(/requires/);
371
- expect(() =>
372
- creatingOpen["relatedIds"]({ Tags: [{ id: "" }] }, {
373
- destinationProperty: "Tags",
374
- sourceProperty: "id",
375
- relatedKey: "id",
376
- }),
377
- ).toThrow(/requires/);
378
- expect(() =>
379
- creatingOpen["relatedIds"]({ Tags: [{ id: { nested: true } }] }, {
380
- destinationProperty: "Tags",
381
- sourceProperty: "id",
382
- relatedKey: "id",
383
- }),
384
- ).toThrow(/requires/);
385
- expect(
386
- creatingOpen["relatedIds"]({ Tags: [{ id: 2 }, { id: 2 }] }, {
387
- destinationProperty: "Tags",
388
- sourceProperty: "id",
389
- relatedKey: "id",
390
- }),
391
- ).toEqual([2]);
392
- expect(open.payload({ Children: [null, "skip", { id: 1 }] }, "Children")).toEqual([{ id: 1 }]);
393
- expect(() =>
394
- open["relatedIds"]({ Tags: [{ id: 0 }] }, {
395
- destinationProperty: "Tags",
396
- sourceProperty: "id",
397
- relatedKey: "id",
398
- }),
399
- ).toThrow(/requires/);
400
- expect(() =>
401
- open["relatedIds"]({ Tags: [{ id: 0n }] }, {
402
- destinationProperty: "Tags",
403
- sourceProperty: "id",
404
- relatedKey: "id",
405
- }),
406
- ).toThrow(/requires/);
407
- expect(() =>
408
- open["relatedIds"]({ Tags: [{ id: "" }] }, {
409
- destinationProperty: "Tags",
410
- sourceProperty: "id",
411
- relatedKey: "id",
412
- }),
413
- ).toThrow(/requires/);
414
- expect(
415
- open["relatedIds"]({ Tags: [{ id: 2 }, { id: 2 }] }, {
416
- destinationProperty: "Tags",
417
- sourceProperty: "id",
418
- relatedKey: "id",
419
- }),
420
- ).toEqual([2]);
421
- expect(open["hasKey"]({}, [])).toBe(false);
422
- expect(open["hasKey"]({ id: 1 }, ["id"])).toBe(true);
423
- expect(open["hasKey"]({ id: 0 }, ["id"])).toBe(false);
424
- expect(open["hasKey"]({ id: 1 }, ["id", "missing"])).toBe(false);
425
- const nested = { parent: { Id: 0 } };
426
- open.stamp(nested, "parent", 4);
427
- expect(nested.parent.Id).toBe(4);
428
- const snake = { parent: { name: "a" } };
429
- open.stamp(snake, "parent", 5);
430
- expect((snake.parent as { id?: number }).id).toBe(5);
431
- const flat = { parent_id: 0 };
432
- open.stamp(flat, "parent_id", 6);
433
- expect(flat.parent_id).toBe(6);
434
- open.stamp(flat, "parent_id", { nested: true });
435
- const withArray = { parent_id: [1, 2] as unknown as number };
436
- open.stamp(withArray, "parent_id", 7);
437
- expect(withArray.parent_id).toBe(7);
438
-
439
- const cascade = new CascadeDeleteEnrichmentStrategy<Bag>();
440
- const cascadeRows = mock([{ tag_id: 0 }, { tag_id: 2 }]);
441
- const cascadeWriter = new CRUDRepository<Item>(cascadeRows.connection, { entity: "links", ids: ["id"] });
442
- await cascade.deleteLinked(cascadeWriter, tags, { id: 1 });
443
- const cascadeUpdate = new CascadeDeleteUpdateEnrichmentStrategy<Bag>();
444
- const cascadeUpdateRows = mock([{ tag_id: 0 }, { tag_id: 3 }]);
445
- const cascadeUpdateWriter = new CRUDRepository<Item>(cascadeUpdateRows.connection, { entity: "links", ids: ["id"] });
446
- await cascadeUpdate.updateLinked(cascadeUpdateWriter, tags, { id: 1, Tags: [{ id: 4 }] });
447
-
448
- const parents = mock([]);
449
- const host = new CRUDRepository<Item>(parents.connection, { type: Item, entity: "parents" });
450
- host.addEnriched(children, writer);
451
- const tree = new RepositoryTree(new RepositoryTreeNode(host, ""));
452
- await new LazyWriteEnrichmentStrategy<Item>().persist(tree, [new Item()], "create");
453
- const associated = new CRUDRepository<Item>(parents.connection, { type: Item, entity: "parents" });
454
- associated.addEnriched(tags, writer);
455
- await expect(
456
- new DefaultWriteEnrichmentStrategy<Item>().persist(
457
- new RepositoryTree(new RepositoryTreeNode(associated, "")),
458
- [{ id: 1, Tags: [{ id: 2 }] } as unknown as Item],
459
- "create",
460
- ),
461
- ).rejects.toThrow(/Tags/);
462
- });
463
-
464
- it("rejects custom fills", async () => {
465
- const { connection } = mock([]);
466
- const via = new CRUDRepository<Item>(connection, { type: Item, entity: "items" });
467
- const read = new DefaultReadonlyEnrichmentStrategy<Item>();
468
- const fill = {
469
- destinationProperty: "name",
470
- sourceProperty: "id",
471
- relatedKey: "id",
472
- type: "custom" as const,
473
- };
474
- await expect(read.apply(via, fill, [])).rejects.toThrow('Unsupported enrichment type "custom"');
475
- const custom = new CRUDRepository<Item>(connection, { type: Item, entity: "parents" });
476
- custom.addEnriched(fill, via);
477
- await expect(
478
- new DefaultWriteEnrichmentStrategy<Item>().persist(
479
- new RepositoryTree(new RepositoryTreeNode(custom, "")),
480
- [new Item()],
481
- "create",
482
- ),
483
- ).rejects.toThrow('Unsupported enrichment type "custom"');
484
- });
485
- });