@deterministic-code/datasources 0.1.0 → 0.1.1

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 (302) hide show
  1. package/dist/ArrayReader.d.ts +12 -0
  2. package/dist/BatchCommandIBulkWriteStrategy.d.ts +33 -0
  3. package/dist/BuiltRepository.d.ts +16 -0
  4. package/dist/BulkCRUDRepository.d.ts +17 -0
  5. package/dist/BulkCommand.d.ts +5 -0
  6. package/dist/BulkWriteEnrichment.d.ts +4 -0
  7. package/dist/CRUDRepository.d.ts +40 -0
  8. package/dist/CRUDRepositoryBuilder.d.ts +19 -0
  9. package/dist/CRUDRepositoryOptions.d.ts +7 -0
  10. package/dist/CRUDRepositoryStatements.d.ts +17 -0
  11. package/dist/CascadeDeleteEnrichmentStrategy.d.ts +7 -0
  12. package/dist/CascadeDeleteUpdateEnrichmentStrategy.d.ts +8 -0
  13. package/dist/CommandMiddlewareHost.d.ts +22 -0
  14. package/dist/ConsoleCommandMiddleware.d.ts +14 -0
  15. package/dist/CreateEnrichmentStrategy.d.ts +14 -0
  16. package/dist/Datasource.d.ts +30 -0
  17. package/dist/DatasourceError.d.ts +3 -0
  18. package/dist/DatasourceFactory.d.ts +12 -0
  19. package/dist/DatasourceOptions.d.ts +1 -0
  20. package/dist/DatasourceUrl.d.ts +12 -0
  21. package/dist/DatasourceUrlParser.d.ts +4 -0
  22. package/dist/DefaultCreateEnrichmentStrategy.d.ts +7 -0
  23. package/dist/DefaultReadonlyEnrichmentStrategy.d.ts +19 -0
  24. package/dist/DefaultUpdateEnrichmentStrategy.d.ts +7 -0
  25. package/dist/DefaultWriteEnrichmentStrategy.d.ts +21 -0
  26. package/dist/DeleteEnrichmentStrategy.d.ts +11 -0
  27. package/dist/DriverLoader.d.ts +5 -0
  28. package/dist/Enrichment.d.ts +13 -0
  29. package/dist/EnrichmentPropertyType.d.ts +7 -0
  30. package/dist/ExpectConsoleMiddleware.d.ts +15 -0
  31. package/dist/FirstResultReader.d.ts +19 -0
  32. package/dist/HashsetOptimizedReadonlyEnrichmentStrategy.d.ts +9 -0
  33. package/dist/IBulkWriteStrategy.d.ts +12 -0
  34. package/dist/ICRUDRepository.d.ts +12 -0
  35. package/dist/ICRUDRepositoryFactory.d.ts +7 -0
  36. package/dist/ICommand.d.ts +20 -0
  37. package/dist/ICommandMiddleware.d.ts +12 -0
  38. package/dist/IConnection.d.ts +12 -0
  39. package/dist/IDatasource.d.ts +18 -0
  40. package/dist/IDatasourceFactory.d.ts +5 -0
  41. package/dist/IDriver.d.ts +19 -0
  42. package/dist/IEnriched.d.ts +6 -0
  43. package/dist/IReader.d.ts +8 -0
  44. package/dist/IReadonlyEnrichmentStrategy.d.ts +7 -0
  45. package/dist/IReadonlyRepository.d.ts +11 -0
  46. package/dist/IRepository.d.ts +4 -0
  47. package/dist/IRepositoryFactory.d.ts +7 -0
  48. package/dist/IRepositoryTree.d.ts +4 -0
  49. package/dist/IRepositoryTreeNode.d.ts +7 -0
  50. package/dist/ITransaction.d.ts +8 -0
  51. package/dist/IUnitOfWork.d.ts +5 -0
  52. package/dist/IWriteEnrichmentStrategy.d.ts +7 -0
  53. package/dist/Information.d.ts +5 -0
  54. package/dist/IsolationLevel.d.ts +7 -0
  55. package/dist/LazyWriteEnrichmentStrategy.d.ts +4 -0
  56. package/dist/NestedToObjectEnrichmentStrategy.d.ts +10 -0
  57. package/dist/Parameter.d.ts +7 -0
  58. package/dist/ParameterDirection.d.ts +7 -0
  59. package/dist/ProviderCatalog.d.ts +7 -0
  60. package/dist/ProviderNotImplementedError.d.ts +4 -0
  61. package/dist/ProviderNotInstalledError.d.ts +4 -0
  62. package/dist/ReadonlyRepository.d.ts +59 -0
  63. package/dist/ReadonlyRepositoryBuilder.d.ts +12 -0
  64. package/dist/ReadonlyRepositoryMappingOptions.d.ts +14 -0
  65. package/dist/ReadonlyRepositoryStatements.d.ts +8 -0
  66. package/dist/RepositoryAccess.d.ts +11 -0
  67. package/dist/RepositoryFactory.d.ts +23 -0
  68. package/dist/RepositoryNotRegisteredError.d.ts +4 -0
  69. package/dist/RepositoryTree.d.ts +6 -0
  70. package/dist/RepositoryTreeNode.d.ts +9 -0
  71. package/dist/Response.d.ts +7 -0
  72. package/dist/Row.d.ts +2 -0
  73. package/dist/SingleCommandIBulkWriteStrategy.d.ts +11 -0
  74. package/dist/StatementMappers.d.ts +16 -0
  75. package/dist/StoredEnrichment.d.ts +11 -0
  76. package/dist/StoredProcedureBulkWriteStrategy.d.ts +27 -0
  77. package/dist/StreamingReader.d.ts +16 -0
  78. package/dist/UnitOfWorkTransaction.d.ts +12 -0
  79. package/dist/UpdateEnrichmentStrategy.d.ts +18 -0
  80. package/dist/WriteMode.d.ts +1 -0
  81. package/dist/builders/Field.d.ts +5 -0
  82. package/dist/builders/Scalar.d.ts +1 -0
  83. package/dist/builders/index.d.ts +2 -0
  84. package/dist/collectAsync.d.ts +1 -0
  85. package/dist/converters/Cell.d.ts +2 -0
  86. package/dist/converters/ChangeCasingConverter.d.ts +7 -0
  87. package/dist/converters/Constructable.d.ts +1 -0
  88. package/dist/converters/MetaDataRowTypeConverter.d.ts +14 -0
  89. package/dist/converters/PluralizerConverter.d.ts +4 -0
  90. package/dist/converters/RegexConverter.d.ts +7 -0
  91. package/dist/converters/ReplaceConverter.d.ts +7 -0
  92. package/dist/converters/RowTypeConverter.d.ts +10 -0
  93. package/dist/converters/ToLowerCaseConverter.d.ts +4 -0
  94. package/dist/converters/ToUpperCaseConverter.d.ts +4 -0
  95. package/dist/converters/TypeConverter.d.ts +5 -0
  96. package/dist/createCRUDRepositoryOptions.d.ts +7 -0
  97. package/dist/createReadonlyRepositoryMappingOptions.d.ts +6 -0
  98. package/dist/dotEnv.d.ts +5 -0
  99. package/dist/index.d.ts +119 -0
  100. package/dist/mappers/ChangeCasingMapper.d.ts +9 -0
  101. package/dist/mappers/DictionaryMapper.d.ts +8 -0
  102. package/dist/mappers/FlatToNestedMapper.d.ts +20 -0
  103. package/dist/mappers/IFlatToNestedMapper.d.ts +6 -0
  104. package/dist/mappers/IMapper.d.ts +4 -0
  105. package/dist/mappers/IdentityMapper.d.ts +5 -0
  106. package/dist/mappers/PluralizerMapper.d.ts +6 -0
  107. package/dist/mappers/RowTypeMapper.d.ts +6 -0
  108. package/dist/mappers/TransformConverterMapper.d.ts +5 -0
  109. package/dist/mappers/TransformMapper.d.ts +6 -0
  110. package/dist/mappers/TypeMap.d.ts +8 -0
  111. package/dist/mappers/TypeMapGroup.d.ts +5 -0
  112. package/dist/mocks/index.d.ts +9 -0
  113. package/dist/mocks/mock-command.d.ts +28 -0
  114. package/dist/mocks/mock-connection.d.ts +22 -0
  115. package/dist/mocks/mock-datasource.d.ts +24 -0
  116. package/dist/mocks/mock-driver.d.ts +15 -0
  117. package/dist/mocks/mock-reader.d.ts +14 -0
  118. package/dist/mocks/mock-repository.d.ts +42 -0
  119. package/dist/mocks/mock-select-statement.d.ts +10 -0
  120. package/dist/mocks/mock-transaction.d.ts +16 -0
  121. package/dist/mocks/mock-where.d.ts +8 -0
  122. package/dist/parametersToRecord.d.ts +2 -0
  123. package/dist/readerToAsyncIterable.d.ts +2 -0
  124. package/dist/splitStatements.d.ts +1 -0
  125. package/dist/statementParameters.d.ts +1 -0
  126. package/dist/statementUsesParameter.d.ts +1 -0
  127. package/dist/statements/Aggregate.d.ts +6 -0
  128. package/dist/statements/ArrayExpression.d.ts +5 -0
  129. package/dist/statements/BulkDeleteStatement.d.ts +11 -0
  130. package/dist/statements/BulkDeleteStatementTextRenderer.d.ts +4 -0
  131. package/dist/statements/BulkInsertStatement.d.ts +12 -0
  132. package/dist/statements/BulkInsertStatementTextRenderer.d.ts +4 -0
  133. package/dist/statements/BulkUpdateStatement.d.ts +16 -0
  134. package/dist/statements/BulkUpdateStatementTextRenderer.d.ts +8 -0
  135. package/dist/statements/CheckConstraint.d.ts +7 -0
  136. package/dist/statements/Cmp.d.ts +9 -0
  137. package/dist/statements/Column.d.ts +9 -0
  138. package/dist/statements/ColumnDefault.d.ts +5 -0
  139. package/dist/statements/Condition.d.ts +3 -0
  140. package/dist/statements/ConditionRenderer.d.ts +12 -0
  141. package/dist/statements/CreateIndexStatement.d.ts +10 -0
  142. package/dist/statements/CreateIndexStatementTextRenderer.d.ts +5 -0
  143. package/dist/statements/CreateTableStatement.d.ts +11 -0
  144. package/dist/statements/CreateTableStatementTextRenderer.d.ts +18 -0
  145. package/dist/statements/DefaultStatementTextRenderer.d.ts +5 -0
  146. package/dist/statements/DeleteStatement.d.ts +9 -0
  147. package/dist/statements/DeleteStatementTextRenderer.d.ts +7 -0
  148. package/dist/statements/ExecuteStoredProcedureStatement.d.ts +9 -0
  149. package/dist/statements/ExecuteStoredProcedureStatementTextRenderer.d.ts +4 -0
  150. package/dist/statements/ExpressionEvaluator.d.ts +5 -0
  151. package/dist/statements/ExpressionRenderer.d.ts +8 -0
  152. package/dist/statements/ForeignKey.d.ts +19 -0
  153. package/dist/statements/IBulkDeleteStatement.d.ts +3 -0
  154. package/dist/statements/IBulkInsertStatement.d.ts +3 -0
  155. package/dist/statements/IBulkUpdateStatement.d.ts +3 -0
  156. package/dist/statements/ICondition.d.ts +4 -0
  157. package/dist/statements/IConditionVisitor.d.ts +6 -0
  158. package/dist/statements/ICreateIndexStatement.d.ts +3 -0
  159. package/dist/statements/ICreateTableStatement.d.ts +3 -0
  160. package/dist/statements/IDeleteStatement.d.ts +5 -0
  161. package/dist/statements/IExecuteStoredProcedureStatement.d.ts +3 -0
  162. package/dist/statements/IExpression.d.ts +2 -0
  163. package/dist/statements/IInsertStatement.d.ts +3 -0
  164. package/dist/statements/IReturnStatement.d.ts +3 -0
  165. package/dist/statements/ISelectStatement.d.ts +5 -0
  166. package/dist/statements/IStatement.d.ts +4 -0
  167. package/dist/statements/IStatementVisitor.d.ts +26 -0
  168. package/dist/statements/ITableConstraint.d.ts +5 -0
  169. package/dist/statements/IUpdateStatement.d.ts +5 -0
  170. package/dist/statements/IWhere.d.ts +6 -0
  171. package/dist/statements/Identifier.d.ts +5 -0
  172. package/dist/statements/InsertStatement.d.ts +9 -0
  173. package/dist/statements/InsertStatementTextRenderer.d.ts +4 -0
  174. package/dist/statements/Join.d.ts +14 -0
  175. package/dist/statements/Literal.d.ts +6 -0
  176. package/dist/statements/Native.d.ts +5 -0
  177. package/dist/statements/NotNull.d.ts +4 -0
  178. package/dist/statements/Operator.d.ts +107 -0
  179. package/dist/statements/OrderBy.d.ts +10 -0
  180. package/dist/statements/PrimaryKey.d.ts +7 -0
  181. package/dist/statements/ReturnStatement.d.ts +9 -0
  182. package/dist/statements/ReturnStatementTextRenderer.d.ts +4 -0
  183. package/dist/statements/SelectInsertedIdStatement.d.ts +8 -0
  184. package/dist/statements/SelectInsertedIdStatementTextRenderer.d.ts +4 -0
  185. package/dist/statements/SelectStatement.d.ts +20 -0
  186. package/dist/statements/SelectStatementOptions.d.ts +15 -0
  187. package/dist/statements/SelectStatementTextRenderer.d.ts +19 -0
  188. package/dist/statements/StatementEvaluator.d.ts +4 -0
  189. package/dist/statements/StatementParser.d.ts +4 -0
  190. package/dist/statements/StatementRenderer.d.ts +42 -0
  191. package/dist/statements/StatementTextRenderer.d.ts +14 -0
  192. package/dist/statements/Subquery.d.ts +6 -0
  193. package/dist/statements/UniqueConstraint.d.ts +7 -0
  194. package/dist/statements/UpdateStatement.d.ts +14 -0
  195. package/dist/statements/UpdateStatementTextRenderer.d.ts +14 -0
  196. package/dist/statements/Where.d.ts +16 -0
  197. package/dist/statements/WhereText.d.ts +8 -0
  198. package/dist/statements/index.d.ts +75 -0
  199. package/dist/stubs/StubCommand.d.ts +15 -0
  200. package/dist/stubs/StubConnection.d.ts +13 -0
  201. package/dist/stubs/StubDatasource.d.ts +20 -0
  202. package/dist/stubs/StubReader.d.ts +11 -0
  203. package/dist/stubs/StubRepository.d.ts +22 -0
  204. package/dist/stubs/StubTransaction.d.ts +10 -0
  205. package/dist/stubs/createStubDatasource.d.ts +2 -0
  206. package/dist/stubs/index.d.ts +7 -0
  207. package/dist/stubs/notImplemented.d.ts +1 -0
  208. package/package.json +14 -6
  209. package/src/ArrayReader.test.ts +23 -0
  210. package/src/BulkCRUDRepository.test.ts +183 -0
  211. package/src/BulkWriteStrategy.test.ts +293 -0
  212. package/src/CRUDRepository.test.ts +420 -0
  213. package/src/CRUDRepository.ts +1 -1
  214. package/src/CRUDRepositoryOptions.test.ts +76 -0
  215. package/src/Command.test.ts +105 -0
  216. package/src/CommandMiddlewareHost.test.ts +98 -0
  217. package/src/Connection.test.ts +34 -0
  218. package/src/ConsoleCommandMiddleware.test.ts +149 -0
  219. package/src/Datasource.test.ts +63 -0
  220. package/src/DatasourceError.test.ts +10 -0
  221. package/src/DatasourceFactory.test.ts +159 -0
  222. package/src/DatasourceUrlParser.test.ts +173 -0
  223. package/src/ExpectConsoleMiddleware.test.ts +79 -0
  224. package/src/FirstResultReader.test.ts +43 -0
  225. package/src/IsolationLevel.test.ts +13 -0
  226. package/src/ProviderCatalog.test.ts +110 -0
  227. package/src/ProviderNotImplementedError.test.ts +11 -0
  228. package/src/ProviderNotInstalledError.test.ts +11 -0
  229. package/src/ReadonlyRepository.test.ts +406 -0
  230. package/src/RepositoryFactory.test.ts +94 -0
  231. package/src/StatementMappers.test.ts +221 -0
  232. package/src/StreamingReader.test.ts +126 -0
  233. package/src/Transaction.test.ts +37 -0
  234. package/src/UnitOfWorkTransaction.test.ts +43 -0
  235. package/src/UserViewCRUDRepository.test.ts +323 -0
  236. package/src/builders/builders.test.ts +404 -0
  237. package/src/converters/ChangeCasingConverter.test.ts +34 -0
  238. package/src/converters/PluralizerConverter.test.ts +43 -0
  239. package/src/converters/RegexConverter.test.ts +11 -0
  240. package/src/converters/ReplaceConverter.test.ts +9 -0
  241. package/src/converters/RowTypeConverter.test.ts +79 -0
  242. package/src/converters/ToLowerCaseConverter.test.ts +9 -0
  243. package/src/converters/ToUpperCaseConverter.test.ts +9 -0
  244. package/src/dotEnv.test.ts +21 -0
  245. package/src/edgeCases.test.ts +485 -0
  246. package/src/mappers/ChangeCasingMapper.test.ts +32 -0
  247. package/src/mappers/DictionaryMapper.test.ts +69 -0
  248. package/src/mappers/FlatToNestedMapper.test.ts +269 -0
  249. package/src/mappers/IdentityMapper.test.ts +12 -0
  250. package/src/mappers/PluralizerMapper.test.ts +40 -0
  251. package/src/mappers/RowTypeMapper.test.ts +12 -0
  252. package/src/mappers/TransformConverterMapper.test.ts +181 -0
  253. package/src/mappers/transformMapper.test.ts +66 -0
  254. package/src/mocks/MockCommand.test.ts +75 -0
  255. package/src/mocks/MockConnection.test.ts +34 -0
  256. package/src/mocks/MockDatasource.test.ts +40 -0
  257. package/src/mocks/MockReader.test.ts +17 -0
  258. package/src/mocks/MockRepository.test.ts +32 -0
  259. package/src/mocks/MockSelectStatement.test.ts +11 -0
  260. package/src/mocks/MockTransaction.test.ts +17 -0
  261. package/src/mocks/MockWhere.test.ts +11 -0
  262. package/src/parametersToRecord.test.ts +19 -0
  263. package/src/public-surface.test.ts +23 -0
  264. package/src/readWithWhereClauseAndCustomFlatToNestedObjectMappingOptions.test.ts +126 -0
  265. package/src/readerToAsyncIterable.test.ts +39 -0
  266. package/src/repository.test.ts +410 -0
  267. package/src/repository.type.test.ts +29 -0
  268. package/src/statements/SelectInsertedIdStatement.test.ts +11 -0
  269. package/src/statements/StatementCompile.test.ts +231 -0
  270. package/src/statements/StatementParser.test.ts +304 -0
  271. package/src/statements/index.ts +1 -1
  272. package/src/stubs/StubDatasource.test.ts +99 -0
  273. package/src/tests/contact/Address.ts +14 -0
  274. package/src/tests/contact/AddressType.ts +6 -0
  275. package/src/tests/contact/Base.ts +7 -0
  276. package/src/tests/contact/Contact.ts +12 -0
  277. package/src/tests/contact/ContactBase.ts +8 -0
  278. package/src/tests/contact/ContactChangeLog.ts +8 -0
  279. package/src/tests/contact/ContactGroup.ts +6 -0
  280. package/src/tests/contact/ContactGroupBase.ts +6 -0
  281. package/src/tests/contact/ContactGroupMember.ts +6 -0
  282. package/src/tests/contact/ContactSource.ts +6 -0
  283. package/src/tests/contact/ContactType.ts +6 -0
  284. package/src/tests/contact/ContactsService.test.ts +118 -0
  285. package/src/tests/contact/ContactsService.ts +32 -0
  286. package/src/tests/contact/ImportContactRequest.ts +4 -0
  287. package/src/tests/contact/ImportContactResult.ts +5 -0
  288. package/src/tests/contact/LegacyContact.ts +7 -0
  289. package/src/tests/contact/LegacyMigrationResult.ts +5 -0
  290. package/src/tests/contact/Phone.ts +9 -0
  291. package/src/tests/contact/PhoneType.ts +6 -0
  292. package/src/tests/contact/asContactsView.ts +63 -0
  293. package/src/tests/contact/contactColumns.ts +40 -0
  294. package/src/tests/contact/contactLookupIds.ts +32 -0
  295. package/src/tests/contact/contactLookups.ts +6 -0
  296. package/src/tests/contact/contactsParity.ts +63 -0
  297. package/src/tests/contact/contactsServiceOf.ts +38 -0
  298. package/src/tests/contact/contactsView.ts +31 -0
  299. package/src/tests/contact/expectContactsView.ts +23 -0
  300. package/src/tests/contact/extraContact.ts +61 -0
  301. package/src/tests/contact/logMapped.ts +5 -0
  302. package/src/tests/contact/seedContacts.ts +31 -0
@@ -0,0 +1,16 @@
1
+ import type { Parameter } from "../Parameter.js";
2
+ import type { Cell } from "../converters/Cell.js";
3
+ import type { IConditionVisitor } from "./IConditionVisitor.js";
4
+ import type { IExpression } from "./IExpression.js";
5
+ import type { IWhere } from "./IWhere.js";
6
+ import type { Comparison } from "./Cmp.js";
7
+ export declare class Where implements IWhere {
8
+ readonly condition: IExpression;
9
+ constructor(condition: IExpression);
10
+ constructor(column: string, op: Comparison, value: Cell);
11
+ and(column: string, op: Comparison, value: Cell): Where;
12
+ or(column: string, op: Comparison, value: Cell): Where;
13
+ map(column: (name: string) => string, value: (name: string, cell: Cell) => Cell): Where;
14
+ accept: (visitor: IConditionVisitor) => string;
15
+ get parameters(): Parameter[];
16
+ }
@@ -0,0 +1,8 @@
1
+ import type { IConditionVisitor } from "./IConditionVisitor.js";
2
+ import type { IWhere } from "./IWhere.js";
3
+ export declare class WhereText implements IWhere {
4
+ private readonly text;
5
+ constructor(text: string);
6
+ get rawText(): string;
7
+ accept: (visitor: IConditionVisitor) => string;
8
+ }
@@ -0,0 +1,75 @@
1
+ export type { IExpression } from "./IExpression.js";
2
+ export type { IStatement } from "./IStatement.js";
3
+ export type { IStatementVisitor } from "./IStatementVisitor.js";
4
+ export type { ICondition } from "./ICondition.js";
5
+ export type { IConditionVisitor } from "./IConditionVisitor.js";
6
+ export type { IWhere } from "./IWhere.js";
7
+ export type { ISelectStatement } from "./ISelectStatement.js";
8
+ export type { IInsertStatement } from "./IInsertStatement.js";
9
+ export type { IUpdateStatement } from "./IUpdateStatement.js";
10
+ export type { IDeleteStatement } from "./IDeleteStatement.js";
11
+ export type { IBulkInsertStatement } from "./IBulkInsertStatement.js";
12
+ export type { IBulkUpdateStatement } from "./IBulkUpdateStatement.js";
13
+ export type { IBulkDeleteStatement } from "./IBulkDeleteStatement.js";
14
+ export type { ICreateTableStatement } from "./ICreateTableStatement.js";
15
+ export type { ICreateIndexStatement } from "./ICreateIndexStatement.js";
16
+ export type { IExecuteStoredProcedureStatement } from "./IExecuteStoredProcedureStatement.js";
17
+ export type { IReturnStatement } from "./IReturnStatement.js";
18
+ export type { Column } from "./Column.js";
19
+ export type { ITableConstraint, TableConstraintKind } from "./ITableConstraint.js";
20
+ export { Join } from "./Join.js";
21
+ export type { JoinKind } from "./Join.js";
22
+ export { Aggregate } from "./Aggregate.js";
23
+ export type { SortDirection } from "./OrderBy.js";
24
+ export { OrderBy } from "./OrderBy.js";
25
+ export type { SelectStatementOptions } from "./SelectStatementOptions.js";
26
+ export { Condition } from "./Condition.js";
27
+ export { Operator } from "./Operator.js";
28
+ export { eq, ne, gt, lt, ge, le } from "./Cmp.js";
29
+ export type { Comparison } from "./Cmp.js";
30
+ export { Identifier } from "./Identifier.js";
31
+ export { Literal } from "./Literal.js";
32
+ export { ArrayExpression } from "./ArrayExpression.js";
33
+ export { Where } from "./Where.js";
34
+ export { ExpressionEvaluator } from "./ExpressionEvaluator.js";
35
+ export { StatementEvaluator } from "./StatementEvaluator.js";
36
+ export { WhereText } from "./WhereText.js";
37
+ export { SelectStatement } from "./SelectStatement.js";
38
+ export { StatementParser } from "./StatementParser.js";
39
+ export { StatementTextRenderer } from "./StatementTextRenderer.js";
40
+ export { DefaultStatementTextRenderer } from "./DefaultStatementTextRenderer.js";
41
+ export { StatementRenderer } from "./StatementRenderer.js";
42
+ export { ExpressionRenderer } from "./ExpressionRenderer.js";
43
+ export { ConditionRenderer } from "./ConditionRenderer.js";
44
+ export { Native, n } from "./Native.js";
45
+ export { Subquery } from "./Subquery.js";
46
+ export { InsertStatement } from "./InsertStatement.js";
47
+ export { UpdateStatement } from "./UpdateStatement.js";
48
+ export { DeleteStatement } from "./DeleteStatement.js";
49
+ export { BulkInsertStatement } from "./BulkInsertStatement.js";
50
+ export { BulkUpdateStatement } from "./BulkUpdateStatement.js";
51
+ export { BulkDeleteStatement } from "./BulkDeleteStatement.js";
52
+ export { BulkInsertStatementTextRenderer } from "./BulkInsertStatementTextRenderer.js";
53
+ export { BulkUpdateStatementTextRenderer } from "./BulkUpdateStatementTextRenderer.js";
54
+ export { BulkDeleteStatementTextRenderer } from "./BulkDeleteStatementTextRenderer.js";
55
+ export { CreateTableStatement } from "./CreateTableStatement.js";
56
+ export { CreateTableStatementTextRenderer } from "./CreateTableStatementTextRenderer.js";
57
+ export { CreateIndexStatement } from "./CreateIndexStatement.js";
58
+ export { CreateIndexStatementTextRenderer } from "./CreateIndexStatementTextRenderer.js";
59
+ export { SelectStatementTextRenderer } from "./SelectStatementTextRenderer.js";
60
+ export { InsertStatementTextRenderer } from "./InsertStatementTextRenderer.js";
61
+ export { UpdateStatementTextRenderer } from "./UpdateStatementTextRenderer.js";
62
+ export { DeleteStatementTextRenderer } from "./DeleteStatementTextRenderer.js";
63
+ export { ExecuteStoredProcedureStatementTextRenderer } from "./ExecuteStoredProcedureStatementTextRenderer.js";
64
+ export { ReturnStatementTextRenderer } from "./ReturnStatementTextRenderer.js";
65
+ export { SelectInsertedIdStatementTextRenderer } from "./SelectInsertedIdStatementTextRenderer.js";
66
+ export { ColumnDefault } from "./ColumnDefault.js";
67
+ export { NotNull } from "./NotNull.js";
68
+ export { PrimaryKey } from "./PrimaryKey.js";
69
+ export { ForeignKey, ReferentialAction } from "./ForeignKey.js";
70
+ export type { ReferentialAction as ReferentialActionName } from "./ForeignKey.js";
71
+ export { UniqueConstraint } from "./UniqueConstraint.js";
72
+ export { CheckConstraint } from "./CheckConstraint.js";
73
+ export { ExecuteStoredProcedureStatement } from "./ExecuteStoredProcedureStatement.js";
74
+ export { SelectInsertedIdStatement } from "./SelectInsertedIdStatement.js";
75
+ export { ReturnStatement } from "./ReturnStatement.js";
@@ -0,0 +1,15 @@
1
+ import type { ICommand } from "../ICommand.js";
2
+ import type { IConnection } from "../IConnection.js";
3
+ import type { Cells } from "../converters/Cell.js";
4
+ import type { IReader } from "../IReader.js";
5
+ import type { Response } from "../Response.js";
6
+ import type { Parameter } from "../Parameter.js";
7
+ import { CommandMiddlewareHost } from "../CommandMiddlewareHost.js";
8
+ import { Native } from "../statements/Native.js";
9
+ export declare class StubCommand extends CommandMiddlewareHost implements ICommand {
10
+ readonly provider: string;
11
+ readonly connection: IConnection;
12
+ constructor(provider: string, connection: IConnection);
13
+ executeReaderNative: (text: Native, parameters?: Parameter[]) => Promise<IReader<Cells>>;
14
+ executeNative: (text: Native, parameters?: Parameter[]) => Promise<Response>;
15
+ }
@@ -0,0 +1,13 @@
1
+ import type { ICommand } from "../ICommand.js";
2
+ import type { IConnection } from "../IConnection.js";
3
+ import type { ITransaction } from "../ITransaction.js";
4
+ export declare class StubConnection implements IConnection {
5
+ readonly provider: string;
6
+ isOpen: boolean;
7
+ constructor(provider: string);
8
+ createCommand: () => ICommand;
9
+ open: () => Promise<void>;
10
+ close: () => Promise<void>;
11
+ [Symbol.asyncDispose]: () => Promise<void>;
12
+ startTransaction: () => Promise<ITransaction>;
13
+ }
@@ -0,0 +1,20 @@
1
+ import type { Constructable } from "../converters/Constructable.js";
2
+ import type { ICommand } from "../ICommand.js";
3
+ import type { IConnection } from "../IConnection.js";
4
+ import type { IDatasource } from "../IDatasource.js";
5
+ import type { IReadonlyRepository } from "../IReadonlyRepository.js";
6
+ import type { ICRUDRepository } from "../ICRUDRepository.js";
7
+ import { RepositoryFactory } from "../RepositoryFactory.js";
8
+ export declare class StubDatasource implements IDatasource {
9
+ readonly provider: string;
10
+ private connection?;
11
+ readonly repositories: RepositoryFactory;
12
+ constructor(provider: string);
13
+ private defaultConnection;
14
+ createConnection: () => Promise<IConnection>;
15
+ createCommand: (connection?: IConnection) => Promise<ICommand>;
16
+ createRepository<T>(type: Constructable<T>, connection?: IConnection): ICRUDRepository<T>;
17
+ createRepository(typeName: string, connection?: IConnection): ICRUDRepository;
18
+ createReadonlyRepository<T>(type: Constructable<T>, connection?: IConnection): IReadonlyRepository<T>;
19
+ createReadonlyRepository(typeName: string, connection?: IConnection): IReadonlyRepository;
20
+ }
@@ -0,0 +1,11 @@
1
+ import type { IReader } from "../IReader.js";
2
+ export declare class StubReader<T = unknown> implements IReader<T> {
3
+ readonly provider: string;
4
+ current: T | undefined;
5
+ constructor(provider: string);
6
+ next(): Promise<boolean>;
7
+ read(): AsyncIterable<T>;
8
+ nextResult(): Promise<boolean>;
9
+ dispose(): Promise<void>;
10
+ [Symbol.asyncDispose]: () => Promise<void>;
11
+ }
@@ -0,0 +1,22 @@
1
+ import type { Scalar } from "../builders/Scalar.js";
2
+ import type { Cells } from "../converters/Cell.js";
3
+ import type { Constructable } from "../converters/Constructable.js";
4
+ import type { IConnection } from "../IConnection.js";
5
+ import type { Parameter } from "../Parameter.js";
6
+ import type { IExecuteStoredProcedureStatement } from "../statements/IExecuteStoredProcedureStatement.js";
7
+ import type { ISelectStatement } from "../statements/ISelectStatement.js";
8
+ import type { ICRUDRepository } from "../ICRUDRepository.js";
9
+ import { ReadonlyRepository } from "../ReadonlyRepository.js";
10
+ import type { ReadonlyRepositoryMappingOptions } from "../ReadonlyRepositoryMappingOptions.js";
11
+ import type { Response } from "../Response.js";
12
+ import type { IWhere } from "../statements/IWhere.js";
13
+ export declare class StubRepository<T = unknown> extends ReadonlyRepository<T> implements ICRUDRepository<T> {
14
+ readonly provider: string;
15
+ readonly ids: readonly string[];
16
+ constructor(provider: string, _connection: IConnection, type?: Constructable<T>);
17
+ read(_query?: ISelectStatement | IWhere | IExecuteStoredProcedureStatement, _parameters?: Parameter[], _options?: ReadonlyRepositoryMappingOptions<T>): AsyncIterable<T>;
18
+ create: (_item: T) => Promise<T>;
19
+ update: (_item: T, _byWhere?: IWhere) => Promise<Response>;
20
+ delete: (_item: T, _byWhere?: IWhere) => Promise<Response>;
21
+ readSingleById: (_id: Scalar | Cells) => Promise<T | undefined>;
22
+ }
@@ -0,0 +1,10 @@
1
+ import type { IConnection } from "../IConnection.js";
2
+ import type { ITransaction } from "../ITransaction.js";
3
+ export declare class StubTransaction implements ITransaction {
4
+ readonly provider: string;
5
+ readonly connection: IConnection;
6
+ readonly isolation: "readCommitted";
7
+ constructor(provider: string, connection: IConnection);
8
+ commit: () => Promise<void>;
9
+ abort: () => Promise<void>;
10
+ }
@@ -0,0 +1,2 @@
1
+ import { StubDatasource } from "./StubDatasource.js";
2
+ export declare const createStubDatasource: (provider: string) => StubDatasource;
@@ -0,0 +1,7 @@
1
+ export { createStubDatasource } from "./createStubDatasource.js";
2
+ export { StubCommand } from "./StubCommand.js";
3
+ export { StubConnection } from "./StubConnection.js";
4
+ export { StubDatasource } from "./StubDatasource.js";
5
+ export { StubReader } from "./StubReader.js";
6
+ export { StubRepository } from "./StubRepository.js";
7
+ export { StubTransaction } from "./StubTransaction.js";
@@ -0,0 +1 @@
1
+ export declare const notImplemented: (provider: string) => never;
package/package.json CHANGED
@@ -1,18 +1,26 @@
1
1
  {
2
2
  "name": "@deterministic-code/datasources",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
- "types": "./src/index.ts",
6
+ "types": "./dist/index.d.ts",
7
7
  "exports": {
8
- ".": "./src/index.ts",
9
- "./mocks": "./src/mocks/index.ts"
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./src/index.ts",
11
+ "default": "./src/index.ts"
12
+ },
13
+ "./mocks": {
14
+ "types": "./dist/mocks/index.d.ts",
15
+ "import": "./src/mocks/index.ts",
16
+ "default": "./src/mocks/index.ts"
17
+ }
10
18
  },
11
19
  "files": [
20
+ "dist",
12
21
  "src"
13
22
  ],
14
23
  "publishConfig": {
15
24
  "access": "public"
16
- },
17
- "license": "MIT"
25
+ }
18
26
  }
@@ -0,0 +1,23 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { ArrayReader } from "./index.ts";
3
+
4
+ describe("ArrayReader", () => {
5
+ it("walks an array including the empty case", async () => {
6
+ const empty = new ArrayReader([]);
7
+ expect(empty.current).toBeUndefined();
8
+ expect(await empty.next()).toBe(false);
9
+ expect(empty.current).toBeUndefined();
10
+
11
+ const reader = new ArrayReader([{ id: 1 }, { id: 2 }]);
12
+ expect(await reader.next()).toBe(true);
13
+ expect(reader.current).toEqual({ id: 1 });
14
+ expect(await reader.next()).toBe(true);
15
+ expect(reader.current).toEqual({ id: 2 });
16
+ expect(await reader.next()).toBe(false);
17
+ expect(reader.current).toBeUndefined();
18
+ expect(await reader.nextResult()).toBe(false);
19
+ expect(await Array.fromAsync(new ArrayReader(["a", "b"]).read())).toEqual(["a", "b"]);
20
+ await reader.dispose();
21
+ await reader[Symbol.asyncDispose]();
22
+ });
23
+ });
@@ -0,0 +1,183 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { MemoryDriver } from "@datasources/memory";
3
+ import { collectAsync } from "./collectAsync.ts";
4
+ import { BulkCRUDRepository } from "./BulkCRUDRepository.ts";
5
+ import { DefaultWriteEnrichmentStrategy } from "./DefaultWriteEnrichmentStrategy.ts";
6
+ import { DatasourceError } from "./DatasourceError.ts";
7
+ import type { IConnection } from "./IConnection.ts";
8
+
9
+ class Parent {
10
+ id = 0;
11
+ label = "";
12
+ children: Child[] = [];
13
+ }
14
+
15
+ class Child {
16
+ id = 0;
17
+ parent_id = 0;
18
+ label = "";
19
+ }
20
+
21
+ const setup = async (): Promise<IConnection> => {
22
+ const connection = new MemoryDriver().connection();
23
+ await connection.open();
24
+ return connection;
25
+ };
26
+
27
+ const relate = (parentsRepo: BulkCRUDRepository<Parent>, childrenRepo: BulkCRUDRepository<Child>) => {
28
+ parentsRepo.addEnriched({ destinationProperty: "children", sourceProperty: "id", relatedKey: "parent_id", type: "list" }, childrenRepo);
29
+ return parentsRepo;
30
+ };
31
+
32
+ describe("BulkCRUDRepository", () => {
33
+ it("creates parents and children", async () => {
34
+ const connection = await setup();
35
+ const parentsRepo = new BulkCRUDRepository(Parent, connection);
36
+ const childrenRepo = new BulkCRUDRepository(Child, connection);
37
+ const ids = await relate(parentsRepo, childrenRepo).createBulk([
38
+ Object.assign(new Parent(), { children: [Object.assign(new Child(), { label: "a" })] }),
39
+ Object.assign(new Parent(), {
40
+ children: [Object.assign(new Child(), { label: "b" }), Object.assign(new Child(), { label: "c" })],
41
+ }),
42
+ ]);
43
+ const parents = await collectAsync(parentsRepo.read());
44
+ const children = await collectAsync(childrenRepo.read());
45
+ expect(parents).toHaveLength(2);
46
+ expect(parents.every((parent) => parent.id > 0)).toBe(true);
47
+ expect(children).toHaveLength(3);
48
+ expect(ids.map((row) => row.id).sort()).toEqual(parents.map((parent) => parent.id).sort());
49
+ });
50
+
51
+ it("createBulk writes each parent", async () => {
52
+ const parentsRepo = new BulkCRUDRepository(Parent, await setup());
53
+ const ids = await parentsRepo.createBulk([
54
+ Object.assign(new Parent(), { label: "a" }),
55
+ Object.assign(new Parent(), { label: "b" }),
56
+ ]);
57
+ const parents = await collectAsync(parentsRepo.read());
58
+ expect(parents).toHaveLength(2);
59
+ expect(ids.map((row) => row.id).sort()).toEqual(parents.map((parent) => parent.id).sort());
60
+ });
61
+
62
+ it("createBulk returns composite ids", async () => {
63
+ class Coded {
64
+ code = "";
65
+ code_extra = "";
66
+ label = "";
67
+ }
68
+ const codesRepo = new BulkCRUDRepository<Coded>(await setup(), {
69
+ type: Coded,
70
+ ids: ["code", "code_extra"],
71
+ });
72
+ const ids = await codesRepo.createBulk([
73
+ Object.assign(new Coded(), { code: "a", code_extra: "ab", label: "one" }),
74
+ Object.assign(new Coded(), { code: "b", code_extra: "ba", label: "two" }),
75
+ ]);
76
+ expect(ids).toEqual([
77
+ Object.assign(new Coded(), { code: "a", code_extra: "ab", label: "one" }),
78
+ Object.assign(new Coded(), { code: "b", code_extra: "ba", label: "two" }),
79
+ ]);
80
+ });
81
+
82
+ it("keeps the first write when a later bulk update throws", async () => {
83
+ const parentsRepo = new BulkCRUDRepository(Parent, await setup());
84
+ const first = await parentsRepo.create(Object.assign(new Parent(), { label: "a" }));
85
+ expect(first.id).toBeGreaterThan(0);
86
+ const second = await parentsRepo.create(Object.assign(new Parent(), { label: "b" }));
87
+ expect(second.id).toBeGreaterThan(0);
88
+ let seen = 0;
89
+ parentsRepo.addMiddleware({
90
+ beforeCommand() {
91
+ seen += 1;
92
+ if (seen === 2) throw new DatasourceError("stop");
93
+ },
94
+ afterCommand() {},
95
+ });
96
+ await expect(parentsRepo.updateBulk([
97
+ Object.assign(new Parent(), { id: first.id, label: "changed" }),
98
+ Object.assign(new Parent(), { id: first.id, label: "later" }),
99
+ ])).rejects.toThrow(/stop/);
100
+ const stored = await collectAsync(parentsRepo.read());
101
+ expect(stored.find((parent) => parent.id === first.id)?.label).toBe("changed");
102
+ });
103
+
104
+ it("rolls back a bulk update when useTransaction is on", async () => {
105
+ const parentsRepo = new BulkCRUDRepository<Parent>(await setup(), {
106
+ type: Parent,
107
+ write: new DefaultWriteEnrichmentStrategy(undefined, undefined, undefined, true),
108
+ });
109
+ const first = await parentsRepo.create(Object.assign(new Parent(), { label: "a" }));
110
+ expect(first.id).toBeGreaterThan(0);
111
+ const second = await parentsRepo.create(Object.assign(new Parent(), { label: "b" }));
112
+ expect(second.id).toBeGreaterThan(0);
113
+ let seen = 0;
114
+ parentsRepo.addMiddleware({
115
+ beforeCommand() {
116
+ seen += 1;
117
+ if (seen === 2) throw new DatasourceError("stop");
118
+ },
119
+ afterCommand() {},
120
+ });
121
+ await expect(parentsRepo.updateBulk([
122
+ Object.assign(new Parent(), { id: first.id, label: "changed" }),
123
+ Object.assign(new Parent(), { id: first.id, label: "later" }),
124
+ ])).rejects.toThrow(/stop/);
125
+ const stored = await collectAsync(parentsRepo.read());
126
+ expect(stored.find((parent) => parent.id === first.id)?.label).toBe("a");
127
+ });
128
+
129
+ it("update replace-syncs each parent", async () => {
130
+ const connection = await setup();
131
+ const parentsRepo = new BulkCRUDRepository(Parent, connection);
132
+ const childrenRepo = new BulkCRUDRepository(Child, connection);
133
+ const first = await parentsRepo.create(Object.assign(new Parent(), { label: "one" }));
134
+ expect(first.id).toBeGreaterThan(0);
135
+ const second = await parentsRepo.create(Object.assign(new Parent(), { label: "two" }));
136
+ expect(second.id).toBeGreaterThan(0);
137
+ const kept = await childrenRepo.create(Object.assign(new Child(), { parent_id: first.id, label: "a" }));
138
+ expect(kept.id).toBeGreaterThan(0);
139
+ const dropped = await childrenRepo.create(Object.assign(new Child(), { parent_id: second.id, label: "b" }));
140
+ expect(dropped.id).toBeGreaterThan(0);
141
+ const response = await relate(parentsRepo, childrenRepo).updateBulk([
142
+ Object.assign(new Parent(), {
143
+ id: first.id,
144
+ label: "one",
145
+ children: [Object.assign(new Child(), { id: kept.id, label: "aa" })],
146
+ }),
147
+ Object.assign(new Parent(), {
148
+ id: second.id,
149
+ label: "two",
150
+ children: [Object.assign(new Child(), { label: "c" })],
151
+ }),
152
+ ]);
153
+ expect(response.rowsAffected).toBe(2);
154
+ const children = await collectAsync(childrenRepo.read());
155
+ expect(children).toHaveLength(2);
156
+ expect(children.find((child) => child.parent_id === first.id)?.label).toBe("aa");
157
+ expect(children.find((child) => child.parent_id === second.id)?.label).toBe("c");
158
+ expect(children.some((child) => child.label === "b")).toBe(false);
159
+ });
160
+
161
+ it("delete cascades each parent", async () => {
162
+ const connection = await setup();
163
+ const parentsRepo = new BulkCRUDRepository(Parent, connection);
164
+ const childrenRepo = new BulkCRUDRepository(Child, connection);
165
+ const first = await parentsRepo.create(Object.assign(new Parent(), { label: "one" }));
166
+ expect(first.id).toBeGreaterThan(0);
167
+ const second = await parentsRepo.create(Object.assign(new Parent(), { label: "two" }));
168
+ expect(second.id).toBeGreaterThan(0);
169
+ const firstChild = await childrenRepo.create(Object.assign(new Child(), { parent_id: first.id, label: "a" }));
170
+ expect(firstChild.id).toBeGreaterThan(0);
171
+ const secondChild = await childrenRepo.create(Object.assign(new Child(), { parent_id: second.id, label: "b" }));
172
+ expect(secondChild.id).toBeGreaterThan(0);
173
+ const kept = await childrenRepo.create(Object.assign(new Child(), { label: "keep" }));
174
+ expect(kept.id).toBeGreaterThan(0);
175
+ const response = await relate(parentsRepo, childrenRepo).deleteBulk([
176
+ Object.assign(new Parent(), { id: first.id }),
177
+ Object.assign(new Parent(), { id: second.id }),
178
+ ]);
179
+ expect(response.rowsAffected).toBe(2);
180
+ expect(await collectAsync(parentsRepo.read())).toEqual([]);
181
+ expect((await collectAsync(childrenRepo.read())).map((child) => child.label)).toEqual(["keep"]);
182
+ });
183
+ });