@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,110 +0,0 @@
1
- import { afterAll, afterEach, beforeEach, describe, expect, it } from "vitest";
2
- import { DriverLoader } from "./DriverLoader.ts";
3
- import { Datasource, DatasourceError, DatasourceFactory, ProviderCatalog, ProviderNotInstalledError } from "./index.ts";
4
-
5
- const envKeys = ["INSTALLED_PROVIDERS", "DATASOURCE_URL", "PROVIDER"] as const;
6
- const savedEnv = Object.fromEntries(envKeys.map((key) => [key, process.env[key]]));
7
-
8
- beforeEach(() => {
9
- for (const key of envKeys) delete process.env[key];
10
- DatasourceFactory.reset();
11
- });
12
-
13
- afterEach(() => DatasourceFactory.reset());
14
-
15
- afterAll(() => {
16
- for (const key of envKeys) {
17
- if (savedEnv[key] === undefined) delete process.env[key];
18
- else process.env[key] = savedEnv[key];
19
- }
20
- });
21
-
22
- describe("ProviderCatalog", () => {
23
- it("default stores location and module", () => {
24
- const sqlite = ProviderCatalog.default.sqlite;
25
- expect(sqlite?.location).toBe("@datasources/sqlite");
26
- expect(sqlite?.module).toBe("SqliteDriver");
27
- expect(ProviderCatalog.default.sqlserver?.module).toBe("SqlServerDriver");
28
- expect(ProviderCatalog.default.mongodb?.module).toBe("MongoDbDriver");
29
- expect(ProviderCatalog.default.dynamodb?.module).toBe("DynamoDbDriver");
30
- });
31
-
32
- it("full constructor stores location and module", () => {
33
- const catalog = new ProviderCatalog("acme", "@acme/data", "AcmeDriver");
34
- expect(catalog.name).toBe("acme");
35
- expect(catalog.location).toBe("@acme/data");
36
- expect(catalog.module).toBe("AcmeDriver");
37
- });
38
-
39
- it("default lists monorepo providers", () => {
40
- expect(Object.keys(ProviderCatalog.default)).toEqual([
41
- "json",
42
- "memory",
43
- "sqlite",
44
- "xml",
45
- "yaml",
46
- "mysql",
47
- "sqlserver",
48
- "postgres",
49
- "oracle",
50
- "mongodb",
51
- "dynamodb",
52
- ]);
53
- });
54
-
55
- it("defaults registers installed providers", () => {
56
- DatasourceFactory.defaults({
57
- INSTALLED_PROVIDERS: "json,memory",
58
- DATASOURCE_URL: "memory://",
59
- });
60
- expect(DatasourceFactory.registered()).toEqual(["json", "memory"]);
61
- expect(
62
- Datasource.create({ PROVIDER: "memory", DATASOURCE_URL: "memory://" }).provider,
63
- ).toBe("memory");
64
- });
65
-
66
- it("create does not take installed providers", () => {
67
- DatasourceFactory.defaults({ INSTALLED_PROVIDERS: "json,memory" });
68
- expect(Datasource.create({ PROVIDER: "json", DATASOURCE_URL: "json://" }).provider).toBe(
69
- "json",
70
- );
71
- expect(DatasourceFactory.registered()).toEqual(["json", "memory"]);
72
- });
73
-
74
- it("create reads connection from the environment", () => {
75
- process.env.INSTALLED_PROVIDERS = "json,memory";
76
- process.env.DATASOURCE_URL = "memory://";
77
- process.env.PROVIDER = "memory";
78
- expect(Datasource.create().provider).toBe("memory");
79
- expect(Datasource.default.provider).toBe("memory");
80
- expect(DatasourceFactory.registered()).toEqual(["json", "memory"]);
81
- });
82
-
83
- it("missing export throws", () => {
84
- expect(() =>
85
- DriverLoader.load(new ProviderCatalog("json", "@datasources/json", "MissingDriver")),
86
- ).toThrow(ProviderNotInstalledError);
87
- });
88
-
89
- it("missing package or unknown name", () => {
90
- expect(() => DatasourceFactory.defaults({ INSTALLED_PROVIDERS: "sqlite" })).toThrow(
91
- ProviderNotInstalledError,
92
- );
93
- expect(() => DatasourceFactory.defaults({ INSTALLED_PROVIDERS: "nope" })).toThrow(
94
- ProviderNotInstalledError,
95
- );
96
- });
97
-
98
- it("default overrides env", () => {
99
- process.env.INSTALLED_PROVIDERS = "json,memory";
100
- process.env.PROVIDER = "json";
101
- process.env.DATASOURCE_URL = "json://";
102
- expect(Datasource.default.provider).toBe("json");
103
- });
104
-
105
- it("url without provider throws", () => {
106
- expect(() => DatasourceFactory.defaults({ DATASOURCE_URL: "not-a-url" })).toThrow(
107
- new DatasourceError("DATASOURCE_URL has no provider"),
108
- );
109
- });
110
- });
@@ -1,21 +0,0 @@
1
- export class ProviderCatalog {
2
- constructor(
3
- readonly name: string,
4
- readonly location: string,
5
- readonly module: string,
6
- ) {}
7
-
8
- static readonly default: Readonly<Record<string, ProviderCatalog>> = {
9
- json: new ProviderCatalog("json", "@datasources/json", "JsonDriver"),
10
- memory: new ProviderCatalog("memory", "@datasources/memory", "MemoryDriver"),
11
- sqlite: new ProviderCatalog("sqlite", "@datasources/sqlite", "SqliteDriver"),
12
- xml: new ProviderCatalog("xml", "@datasources/xml", "XmlDriver"),
13
- yaml: new ProviderCatalog("yaml", "@datasources/yaml", "YamlDriver"),
14
- mysql: new ProviderCatalog("mysql", "@datasources/mysql", "MysqlDriver"),
15
- sqlserver: new ProviderCatalog("sqlserver", "@datasources/sqlserver", "SqlServerDriver"),
16
- postgres: new ProviderCatalog("postgres", "@datasources/postgres", "PostgresDriver"),
17
- oracle: new ProviderCatalog("oracle", "@datasources/oracle", "OracleDriver"),
18
- mongodb: new ProviderCatalog("mongodb", "@datasources/mongodb", "MongoDbDriver"),
19
- dynamodb: new ProviderCatalog("dynamodb", "@datasources/dynamodb", "DynamoDbDriver"),
20
- };
21
- }
@@ -1,11 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { ProviderNotImplementedError } from "./index.ts";
3
-
4
- describe("ProviderNotImplementedError", () => {
5
- it("reports an unimplemented provider", () => {
6
- const error = new ProviderNotImplementedError("oracle");
7
- expect(error.name).toBe("ProviderNotImplementedError");
8
- expect(error.provider).toBe("oracle");
9
- expect(error.message).toContain("oracle");
10
- });
11
- });
@@ -1,9 +0,0 @@
1
- export class ProviderNotImplementedError extends Error {
2
- readonly provider: string;
3
-
4
- constructor(provider: string) {
5
- super(`Provider "${provider}" is not implemented`);
6
- this.name = "ProviderNotImplementedError";
7
- this.provider = provider;
8
- }
9
- }
@@ -1,11 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { ProviderNotInstalledError } from "./index.ts";
3
-
4
- describe("ProviderNotInstalledError", () => {
5
- it("reports a missing provider", () => {
6
- const error = new ProviderNotInstalledError("mysql");
7
- expect(error.name).toBe("ProviderNotInstalledError");
8
- expect(error.provider).toBe("mysql");
9
- expect(error.message).toContain("mysql");
10
- });
11
- });
@@ -1,9 +0,0 @@
1
- export class ProviderNotInstalledError extends Error {
2
- readonly provider: string;
3
-
4
- constructor(provider: string) {
5
- super(`Provider "${provider}" is not installed`);
6
- this.name = "ProviderNotInstalledError";
7
- this.provider = provider;
8
- }
9
- }
@@ -1,406 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { MemoryDriver } from "@datasources/memory";
3
- import { collectAsync } from "./collectAsync.ts";
4
- import type { Cells } from "./converters/Cell.ts";
5
- import { TypeConverter } from "./converters/TypeConverter.ts";
6
- import { DefaultReadonlyEnrichmentStrategy } from "./DefaultReadonlyEnrichmentStrategy.ts";
7
- import { NestedToObjectEnrichmentStrategy } from "./NestedToObjectEnrichmentStrategy.ts";
8
- import { HashsetOptimizedReadonlyEnrichmentStrategy } from "./HashsetOptimizedReadonlyEnrichmentStrategy.ts";
9
- import { ReadonlyRepository } from "./ReadonlyRepository.ts";
10
- import { RepositoryTreeNode } from "./RepositoryTreeNode.ts";
11
- import { ChangeCasingMapper } from "./mappers/ChangeCasingMapper.ts";
12
- import { DictionaryMapper } from "./mappers/DictionaryMapper.ts";
13
- import type { IMapper } from "./mappers/IMapper.ts";
14
- import { TransformMapper } from "./mappers/TransformMapper.ts";
15
- import type { IConnection } from "./IConnection.ts";
16
- import type { Scalar } from "./builders/Scalar.ts";
17
- import { MockCommand } from "./mocks/mock-command.ts";
18
- import { MockConnection } from "./mocks/mock-connection.ts";
19
- import { MockReader } from "./mocks/mock-reader.ts";
20
- import { Join, Operator, SelectStatement, Where } from "./statements/index.ts";
21
- import { WhereText } from "./statements/WhereText.ts";
22
-
23
- class UserType {
24
- Id = 0;
25
- Name = "";
26
- }
27
-
28
- class Child {
29
- Id = 0;
30
- ParentId = 0;
31
- Type = new UserType();
32
- TypeName = "";
33
- Label = "";
34
- }
35
-
36
- class Parent {
37
- Id = 0;
38
- Type = new UserType();
39
- TypeName = "";
40
- Children: Child[] = [];
41
- Child?: Child | string;
42
- }
43
-
44
- class View {
45
- UserType = "";
46
- }
47
-
48
- type Seed = Record<string, Scalar>;
49
-
50
- const snake = new ChangeCasingMapper("pascalCase", "snakeCase");
51
- const references = new DictionaryMapper<string>([["Type", "type_id"]]);
52
- const columns: IMapper<string, string> = new TransformMapper(
53
- (name) => {
54
- const mapped = references.map(name);
55
- return mapped !== name ? mapped : snake.map(name);
56
- },
57
- (name) => {
58
- const from = references.reverseMap(name);
59
- return from !== name ? from : snake.reverseMap(name);
60
- },
61
- );
62
-
63
- const repo = <T>(type: new () => T, connection: IConnection) =>
64
- new ReadonlyRepository(connection, { type, propertyMappings: columns });
65
-
66
- const setup = async (rows: Seed[] = []): Promise<IConnection> => {
67
- const connection = new MemoryDriver().connection();
68
- await connection.open();
69
- for (const row of rows) {
70
- const response = await connection.createCommand().execute(
71
- "insert",
72
- Object.entries(row).map(([name, value]) => ({ name, value })),
73
- );
74
- if (typeof response.result === "number") row.id = response.result;
75
- }
76
- return connection;
77
- };
78
-
79
- const remove = (connection: IConnection, row: Seed) =>
80
- connection.createCommand().execute("delete", [{ name: "id", value: row.id }]);
81
-
82
- describe("ReadonlyRepository", () => {
83
- it("reads one row through a where clause", async () => {
84
- const first: Seed = {};
85
- const second: Seed = {};
86
- const connection = await setup([first, second]);
87
- const parentsRepo = repo(Parent, connection);
88
- const byClause = await collectAsync(parentsRepo.read(new Where(new Operator.Equals("Id", first.id))));
89
- const byWhere = await collectAsync(parentsRepo.read(new WhereText(JSON.stringify({ id: first.id }))));
90
- expect(byClause.map((item) => item.Id)).toEqual([first.id]);
91
- expect(byWhere.map((item) => item.Id)).toEqual([first.id]);
92
- });
93
-
94
- it("fills lookup select and leaves missing default", async () => {
95
- const person: Seed = { name: "person" };
96
- const gone: Seed = { name: "gone" };
97
- const typesConnection = await setup([person, gone]);
98
- await remove(typesConnection, gone);
99
- const connection = await setup([{ type_id: person.id }, { type_id: gone.id }]);
100
- const parentsRepo = repo(Parent, connection);
101
- const typesRepo = repo(UserType, typesConnection);
102
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo);
103
- const items = await collectAsync(parentsRepo.read());
104
- expect(items[0]?.TypeName).toBe("person");
105
- expect(items[1]?.TypeName).toBe("");
106
- });
107
-
108
- it("hashset fills lookup select and leaves missing default", async () => {
109
- const person: Seed = { name: "person" };
110
- const gone: Seed = { name: "gone" };
111
- const typesConnection = await setup([person, gone]);
112
- await remove(typesConnection, gone);
113
- const connection = await setup([{ type_id: person.id }, { type_id: gone.id }]);
114
- const parentsRepo = repo(Parent, connection);
115
- const typesRepo = repo(UserType, typesConnection);
116
- parentsRepo.addEnriched(
117
- { destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" },
118
- typesRepo,
119
- new HashsetOptimizedReadonlyEnrichmentStrategy(),
120
- );
121
- const items = await collectAsync(parentsRepo.read());
122
- expect(items[0]?.TypeName).toBe("person");
123
- expect(items[1]?.TypeName).toBe("");
124
- });
125
-
126
- it("fills lists and readSingle is enriched", async () => {
127
- const org: Seed = { name: "org" };
128
- const typesConnection = await setup([org]);
129
- const parent: Seed = { type_id: org.id };
130
- const other: Seed = { type_id: org.id };
131
- const connection = await setup([parent, other]);
132
- await remove(connection, other);
133
- const parentsRepo = repo(Parent, connection);
134
- const typesRepo = repo(UserType, typesConnection);
135
- const childrenConnection = await setup([
136
- { parent_id: parent.id, label: "a" },
137
- { parent_id: parent.id, label: "b" },
138
- { parent_id: other.id, label: "x" },
139
- ]);
140
- const childrenRepo = repo(Child, childrenConnection);
141
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo);
142
- parentsRepo.addEnriched({ destinationProperty: "Children", sourceProperty: "Id", relatedKey: "ParentId", type: "list" }, childrenRepo);
143
- const item = await parentsRepo.readSingle();
144
- expect(item?.TypeName).toBe("org");
145
- expect(item?.Children.map((child) => child.Label)).toEqual(["a", "b"]);
146
- });
147
-
148
- it("hashset fills lists and readSingle is enriched", async () => {
149
- const org: Seed = { name: "org" };
150
- const typesConnection = await setup([org]);
151
- const parent: Seed = { type_id: org.id };
152
- const other: Seed = { type_id: org.id };
153
- const connection = await setup([parent, other]);
154
- await remove(connection, other);
155
- const parentsRepo = repo(Parent, connection);
156
- const typesRepo = repo(UserType, typesConnection);
157
- const childrenConnection = await setup([
158
- { parent_id: parent.id, label: "a" },
159
- { parent_id: parent.id, label: "b" },
160
- { parent_id: other.id, label: "x" },
161
- ]);
162
- const childrenRepo = repo(Child, childrenConnection);
163
- const strategy = new HashsetOptimizedReadonlyEnrichmentStrategy<Parent>();
164
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo, strategy);
165
- parentsRepo.addEnriched({ destinationProperty: "Children", sourceProperty: "Id", relatedKey: "ParentId", type: "list" }, childrenRepo, strategy);
166
- const item = await parentsRepo.readSingle();
167
- expect(item?.TypeName).toBe("org");
168
- expect(item?.Children.map((child) => child.Label)).toEqual(["a", "b"]);
169
- });
170
-
171
- it("nests list lookup and keeps root sibling", async () => {
172
- const org: Seed = { name: "org" };
173
- const typesConnection = await setup([org]);
174
- const home: Seed = { name: "home" };
175
- const gone: Seed = { name: "gone" };
176
- const childTypesConnection = await setup([home, gone]);
177
- await remove(childTypesConnection, gone);
178
- const parent: Seed = { type_id: org.id };
179
- const connection = await setup([parent]);
180
- const parentsRepo = repo(Parent, connection);
181
- const typesRepo = repo(UserType, typesConnection);
182
- const childTypesRepo = repo(UserType, childTypesConnection);
183
- const childrenConnection = await setup([
184
- { parent_id: parent.id, type_id: home.id, label: "a" },
185
- { parent_id: parent.id, type_id: gone.id, label: "b" },
186
- ]);
187
- const childrenRepo = repo(Child, childrenConnection);
188
- childrenRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, childTypesRepo);
189
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo);
190
- parentsRepo.addEnriched({ destinationProperty: "Children", sourceProperty: "Id", relatedKey: "ParentId", type: "list" }, childrenRepo);
191
- const item = await parentsRepo.readSingle();
192
- expect(item?.TypeName).toBe("org");
193
- expect(item?.Children[0]?.TypeName).toBe("home");
194
- expect(item?.Children[1]?.TypeName).toBe("");
195
- });
196
-
197
- it("hashset nests list lookup and keeps root sibling", async () => {
198
- const org: Seed = { name: "org" };
199
- const typesConnection = await setup([org]);
200
- const home: Seed = { name: "home" };
201
- const gone: Seed = { name: "gone" };
202
- const childTypesConnection = await setup([home, gone]);
203
- await remove(childTypesConnection, gone);
204
- const parent: Seed = { type_id: org.id };
205
- const connection = await setup([parent]);
206
- const parentsRepo = repo(Parent, connection);
207
- const typesRepo = repo(UserType, typesConnection);
208
- const childTypesRepo = repo(UserType, childTypesConnection);
209
- const childrenConnection = await setup([
210
- { parent_id: parent.id, type_id: home.id, label: "a" },
211
- { parent_id: parent.id, type_id: gone.id, label: "b" },
212
- ]);
213
- const childrenRepo = repo(Child, childrenConnection);
214
- const strategy = new HashsetOptimizedReadonlyEnrichmentStrategy<Parent>();
215
- childrenRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, childTypesRepo);
216
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo, strategy);
217
- parentsRepo.addEnriched({ destinationProperty: "Children", sourceProperty: "Id", relatedKey: "ParentId", type: "list" }, childrenRepo, strategy);
218
- const item = await parentsRepo.readSingle();
219
- expect(item?.TypeName).toBe("org");
220
- expect(item?.Children[0]?.TypeName).toBe("home");
221
- expect(item?.Children[1]?.TypeName).toBe("");
222
- });
223
-
224
- it("skips missing enrichment keys", async () => {
225
- const connection = await setup([{ type_id: -1 }, { type_id: -1 }]);
226
- const parentsRepo = repo(Parent, connection);
227
- const typesRepo = repo(UserType, await setup([{ name: "person" }]));
228
- const childrenRepo = repo(Child, await setup([{ label: "a" }]));
229
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo);
230
- parentsRepo.addEnriched({ destinationProperty: "Children", sourceProperty: "Id", relatedKey: "ParentId", type: "list" }, childrenRepo);
231
- const items = await collectAsync(parentsRepo.read());
232
- expect(items[0]?.TypeName).toBe("");
233
- expect(items[1]?.TypeName).toBe("");
234
- expect(items[1]?.Children).toEqual([]);
235
- });
236
-
237
- it("readSingle is undefined when empty", async () => {
238
- const parentsRepo = repo(Parent, await setup());
239
- expect(await parentsRepo.readSingle()).toBeUndefined();
240
- });
241
-
242
- it("nests on a singular related object and skips strings", async () => {
243
- const kept: Seed = { child: "skip" };
244
- const nested: Seed = {};
245
- const connection = await setup([kept, nested]);
246
- const parentsRepo = repo(Parent, connection);
247
- const home: Seed = { name: "home" };
248
- const childTypesRepo = repo(UserType, await setup([home]));
249
- const childrenRepo = repo(Child, await setup([
250
- { parent_id: nested.id, type_id: home.id, label: "only" },
251
- ]));
252
- childrenRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, childTypesRepo);
253
- parentsRepo.addEnriched({ destinationProperty: "Child", sourceProperty: "Id", relatedKey: "ParentId" }, childrenRepo);
254
- const items = await collectAsync(parentsRepo.read());
255
- expect(items[0]?.Child).toBe("skip");
256
- expect(items[1]?.Child && typeof items[1].Child === "object" ? items[1].Child.TypeName : undefined).toBe("home");
257
- });
258
-
259
- it("throws when an enrichment key is an object", async () => {
260
- const typesRepo = repo(UserType, await setup());
261
- await expect(
262
- new DefaultReadonlyEnrichmentStrategy<Parent>().apply(
263
- typesRepo,
264
- { destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" },
265
- [Object.assign(new Parent(), { Id: 1, Type: { Name: "x" } })],
266
- ),
267
- ).rejects.toThrow(/scalar/);
268
- });
269
-
270
- it("hashset assigns the related row when select is omitted", async () => {
271
- const person: Seed = { name: "person" };
272
- const typesConnection = await setup([person]);
273
- const connection = await setup([{ type_id: person.id }]);
274
- const parentsRepo = repo(Parent, connection);
275
- const typesRepo = repo(UserType, typesConnection);
276
- parentsRepo.addEnriched(
277
- { destinationProperty: "Type", sourceProperty: "Type", relatedKey: "Id" },
278
- typesRepo,
279
- new HashsetOptimizedReadonlyEnrichmentStrategy(),
280
- );
281
- const items = await collectAsync(parentsRepo.read());
282
- expect(items[0]?.Type).toMatchObject({ Name: "person" });
283
- });
284
-
285
- it("hashset skips missing keys and unmatched rows", async () => {
286
- const person: Seed = { name: "person" };
287
- const typesConnection = await setup([person]);
288
- const matched: Seed = { type_id: person.id };
289
- const missing: Seed = { type_id: Number(person.id) + 1 };
290
- const blank: Seed = { type_id: -1 };
291
- const connection = await setup([matched, missing, blank]);
292
- const parentsRepo = repo(Parent, connection);
293
- const typesRepo = repo(UserType, typesConnection);
294
- const childrenConnection = await setup([
295
- { label: "orphan" },
296
- { parent_id: matched.id, label: "a" },
297
- { parent_id: matched.id, label: "b" },
298
- ]);
299
- const childrenRepo = repo(Child, childrenConnection);
300
- const strategy = new HashsetOptimizedReadonlyEnrichmentStrategy<Parent>();
301
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo, strategy);
302
- parentsRepo.addEnriched({ destinationProperty: "Children", sourceProperty: "Id", relatedKey: "ParentId", type: "list" }, childrenRepo, strategy);
303
- const items = await collectAsync(parentsRepo.read());
304
- expect(items[0]?.TypeName).toBe("person");
305
- expect(items[0]?.Children.map((child) => child.Label)).toEqual(["a", "b"]);
306
- expect(items[1]?.TypeName).toBe("");
307
- expect(items[1]?.Children).toEqual([]);
308
- expect(items[2]?.Children).toEqual([]);
309
- expect(new RepositoryTreeNode({}, "").value).toEqual({});
310
- });
311
-
312
- it("collapses join rows", async () => {
313
- const person: Seed = { TypeName: "person" };
314
- const org: Seed = { TypeName: "org" };
315
- const connection = await setup([person, org]);
316
- person.Id = person.id;
317
- org.Id = org.id;
318
- const parents: Parent[] = [];
319
- const parentsRepo = repo(Parent, connection);
320
- await new NestedToObjectEnrichmentStrategy<Parent>({
321
- key: "Id",
322
- fields: { Id: "Id", TypeName: "TypeName" },
323
- }).apply(parentsRepo, { destinationProperty: "TypeName", sourceProperty: "Id", relatedKey: "Id" }, parents, [person, org]);
324
- const items = parents;
325
- expect(items.map((item) => item.Id)).toEqual([person.id, org.id]);
326
- expect(items.map((item) => item.TypeName)).toEqual(["person", "org"]);
327
- });
328
-
329
- it("lookup key comes from renamed row", async () => {
330
- const admin: Seed = { name: "admin" };
331
- const typesConnection = await setup([admin]);
332
- const typesRepo = repo(UserType, typesConnection);
333
- const usersConnection = await setup([{ user_type_id: admin.id }]);
334
- const usersRepo = new ReadonlyRepository(usersConnection, {
335
- type: View,
336
- propertyMappings: new DictionaryMapper([["UserType", "user_type_id"]]),
337
- });
338
- usersRepo.addEnriched({ destinationProperty: "UserType", sourceProperty: "UserType", relatedKey: "Id", relatedProperty: "Name" }, typesRepo);
339
- const item = await usersRepo.readSingle();
340
- expect(item?.UserType).toBe("admin");
341
- });
342
-
343
- it("uses per-call object and row converters when provided", async () => {
344
- class Item {
345
- Label = "";
346
- }
347
- class FixedLabel extends TypeConverter<Item, Cells> {
348
- constructor(private readonly label: string) {
349
- super();
350
- }
351
- convert = (_from: Cells): Item => Object.assign(new Item(), { Label: this.label });
352
- reverseConvert = (to: Item): Cells => ({ Label: to.Label });
353
- }
354
- class TagLabel extends TypeConverter<Item, Cells> {
355
- convert = (from: Cells): Item =>
356
- Object.assign(new Item(), { Label: `tag:${String(from.Label)}` });
357
- reverseConvert = (to: Item): Cells => ({ Label: to.Label });
358
- }
359
- class UpperLabel extends TypeConverter<Cells, Cells> {
360
- convert = (from: Cells): Cells => ({
361
- ...from,
362
- Label: String(from.Label).toUpperCase(),
363
- });
364
- reverseConvert = (to: Cells): Cells => to;
365
- }
366
-
367
- const connection = new MockConnection();
368
- const command = new MockCommand(connection);
369
- connection.command = command;
370
- command.reader = new MockReader([{ Label: "ada" }]);
371
- const itemsRepo = new ReadonlyRepository(connection, {
372
- type: Item,
373
- entity: "items",
374
- readProperties: ["Label"],
375
- objectConverter: new FixedLabel("default"),
376
- });
377
- expect((await itemsRepo.readSingle())?.Label).toBe("default");
378
-
379
- command.reader = new MockReader([{ Label: "ada" }]);
380
- expect(
381
- (
382
- await itemsRepo.readSingle(undefined, undefined, {
383
- objectConverter: new TagLabel(),
384
- rowConverter: new UpperLabel(),
385
- })
386
- )?.Label,
387
- ).toBe("tag:ADA");
388
- });
389
-
390
- it("public include uses the node binder", async () => {
391
- const person: Seed = { name: "person" };
392
- const typesConnection = await setup([person]);
393
- const connection = await setup([{ type_id: person.id }]);
394
- const parentsRepo = repo(Parent, connection);
395
- const typesRepo = repo(UserType, typesConnection);
396
- parentsRepo.addEnriched({ destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" }, typesRepo);
397
- const items = await collectAsync(parentsRepo.read());
398
- expect(items[0]?.TypeName).toBe("person");
399
- await new DefaultReadonlyEnrichmentStrategy<Parent>().apply(
400
- typesRepo,
401
- { destinationProperty: "TypeName", sourceProperty: "Type", relatedKey: "Id", relatedProperty: "Name" },
402
- items,
403
- [{ Type: person.id }],
404
- );
405
- });
406
- });