@uql/core 1.0.12 → 3.0.0

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 (466) hide show
  1. package/CHANGELOG.md +243 -0
  2. package/LICENSE.md +2 -2
  3. package/dist/CHANGELOG.md +186 -0
  4. package/dist/README.md +413 -0
  5. package/dist/browser/http/bus.d.ts +3 -0
  6. package/dist/browser/http/bus.js +14 -0
  7. package/dist/browser/http/http.d.ts +6 -0
  8. package/dist/browser/http/http.js +45 -0
  9. package/dist/browser/http/index.d.ts +2 -0
  10. package/dist/browser/http/index.js +3 -0
  11. package/dist/browser/index.d.ts +4 -0
  12. package/dist/browser/index.js +5 -0
  13. package/dist/browser/options.d.ts +4 -0
  14. package/dist/browser/options.js +14 -0
  15. package/dist/browser/querier/genericClientRepository.d.ts +17 -0
  16. package/dist/browser/querier/genericClientRepository.js +39 -0
  17. package/dist/browser/querier/httpQuerier.d.ts +20 -0
  18. package/dist/browser/querier/httpQuerier.js +71 -0
  19. package/dist/browser/querier/index.d.ts +3 -0
  20. package/dist/browser/querier/index.js +4 -0
  21. package/dist/browser/querier/querier.util.d.ts +2 -0
  22. package/dist/browser/querier/querier.util.js +17 -0
  23. package/dist/browser/type/clientQuerier.d.ts +16 -0
  24. package/dist/browser/type/clientQuerier.js +2 -0
  25. package/dist/browser/type/clientQuerierPool.d.ts +4 -0
  26. package/dist/browser/type/clientQuerierPool.js +2 -0
  27. package/dist/browser/type/clientRepository.d.ts +13 -0
  28. package/dist/browser/type/clientRepository.js +2 -0
  29. package/dist/browser/type/index.d.ts +4 -0
  30. package/dist/browser/type/index.js +5 -0
  31. package/dist/browser/type/request.d.ts +28 -0
  32. package/dist/browser/type/request.js +2 -0
  33. package/dist/browser/uql-browser.min.js +2150 -0
  34. package/dist/browser/uql-browser.min.js.map +1 -0
  35. package/dist/dialect/abstractDialect.d.ts +16 -0
  36. package/dist/dialect/abstractDialect.js +28 -0
  37. package/dist/dialect/abstractSqlDialect.d.ts +47 -0
  38. package/dist/dialect/abstractSqlDialect.js +650 -0
  39. package/dist/dialect/index.d.ts +3 -0
  40. package/dist/dialect/index.js +4 -0
  41. package/dist/dialect/queryContext.d.ts +48 -0
  42. package/dist/dialect/queryContext.js +65 -0
  43. package/{entity → dist/entity}/decorator/definition.d.ts +3 -3
  44. package/dist/entity/decorator/definition.js +214 -0
  45. package/{entity → dist/entity}/decorator/entity.d.ts +1 -1
  46. package/dist/entity/decorator/entity.js +7 -0
  47. package/{entity → dist/entity}/decorator/field.d.ts +1 -1
  48. package/dist/entity/decorator/field.js +8 -0
  49. package/{entity → dist/entity}/decorator/id.d.ts +1 -1
  50. package/dist/entity/decorator/id.js +8 -0
  51. package/dist/entity/decorator/index.d.ts +5 -0
  52. package/dist/entity/decorator/index.js +6 -0
  53. package/{entity → dist/entity}/decorator/relation.d.ts +1 -1
  54. package/dist/entity/decorator/relation.js +20 -0
  55. package/dist/entity/index.d.ts +1 -0
  56. package/dist/entity/index.js +2 -0
  57. package/dist/express/index.d.ts +2 -0
  58. package/dist/express/index.js +3 -0
  59. package/dist/express/querierMiddleware.d.ts +26 -0
  60. package/dist/express/querierMiddleware.js +190 -0
  61. package/dist/express/query.util.d.ts +2 -0
  62. package/dist/express/query.util.js +19 -0
  63. package/dist/index.d.ts +9 -0
  64. package/dist/index.js +10 -0
  65. package/dist/maria/index.d.ts +3 -0
  66. package/dist/maria/index.js +4 -0
  67. package/dist/maria/mariaDialect.d.ts +8 -0
  68. package/dist/maria/mariaDialect.js +38 -0
  69. package/dist/maria/mariaQuerierPool.test.d.ts +5 -0
  70. package/dist/maria/mariaQuerierPool.test.js +19 -0
  71. package/dist/maria/mariadbQuerier.d.ts +17 -0
  72. package/dist/maria/mariadbQuerier.js +39 -0
  73. package/dist/maria/mariadbQuerier.test.d.ts +4 -0
  74. package/dist/maria/mariadbQuerier.test.js +19 -0
  75. package/dist/maria/mariadbQuerierPool.d.ts +10 -0
  76. package/dist/maria/mariadbQuerierPool.js +17 -0
  77. package/dist/migrate/cli.d.ts +2 -0
  78. package/dist/migrate/cli.js +254 -0
  79. package/dist/migrate/generator/index.d.ts +4 -0
  80. package/dist/migrate/generator/index.js +5 -0
  81. package/dist/migrate/generator/mongoSchemaGenerator.d.ts +12 -0
  82. package/dist/migrate/generator/mongoSchemaGenerator.js +100 -0
  83. package/dist/migrate/generator/mysqlSchemaGenerator.d.ts +14 -0
  84. package/dist/migrate/generator/mysqlSchemaGenerator.js +81 -0
  85. package/dist/migrate/generator/postgresSchemaGenerator.d.ts +18 -0
  86. package/dist/migrate/generator/postgresSchemaGenerator.js +111 -0
  87. package/dist/migrate/generator/sqliteSchemaGenerator.d.ts +14 -0
  88. package/dist/migrate/generator/sqliteSchemaGenerator.js +68 -0
  89. package/dist/migrate/index.d.ts +12 -0
  90. package/dist/migrate/index.js +17 -0
  91. package/dist/migrate/introspection/index.d.ts +4 -0
  92. package/dist/migrate/introspection/index.js +5 -0
  93. package/dist/migrate/introspection/mongoIntrospector.d.ts +8 -0
  94. package/dist/migrate/introspection/mongoIntrospector.js +46 -0
  95. package/dist/migrate/introspection/mysqlIntrospector.d.ts +25 -0
  96. package/dist/migrate/introspection/mysqlIntrospector.js +220 -0
  97. package/dist/migrate/introspection/postgresIntrospector.d.ts +21 -0
  98. package/dist/migrate/introspection/postgresIntrospector.js +269 -0
  99. package/dist/migrate/introspection/sqliteIntrospector.d.ts +23 -0
  100. package/dist/migrate/introspection/sqliteIntrospector.js +212 -0
  101. package/dist/migrate/migrator-mongo.test.d.ts +1 -0
  102. package/dist/migrate/migrator-mongo.test.js +54 -0
  103. package/dist/migrate/migrator.d.ts +133 -0
  104. package/dist/migrate/migrator.js +600 -0
  105. package/dist/migrate/migrator.test.d.ts +1 -0
  106. package/dist/migrate/migrator.test.js +106 -0
  107. package/dist/migrate/schemaGenerator.d.ts +78 -0
  108. package/dist/migrate/schemaGenerator.js +363 -0
  109. package/dist/migrate/storage/databaseStorage.d.ts +24 -0
  110. package/dist/migrate/storage/databaseStorage.js +77 -0
  111. package/dist/migrate/storage/index.d.ts +2 -0
  112. package/dist/migrate/storage/index.js +3 -0
  113. package/dist/migrate/storage/jsonStorage.d.ts +15 -0
  114. package/dist/migrate/storage/jsonStorage.js +51 -0
  115. package/dist/migrate/type.d.ts +1 -0
  116. package/dist/migrate/type.js +2 -0
  117. package/dist/mongo/index.d.ts +3 -0
  118. package/dist/mongo/index.js +4 -0
  119. package/dist/mongo/mongoDialect.d.ts +34 -0
  120. package/dist/mongo/mongoDialect.js +163 -0
  121. package/dist/mongo/mongodbQuerier.d.ts +28 -0
  122. package/dist/mongo/mongodbQuerier.js +204 -0
  123. package/dist/mongo/mongodbQuerier.test.d.ts +1 -0
  124. package/dist/mongo/mongodbQuerier.test.js +36 -0
  125. package/dist/mongo/mongodbQuerierPool.d.ts +10 -0
  126. package/dist/mongo/mongodbQuerierPool.js +20 -0
  127. package/dist/mongo/mongodbQuerierPool.test.d.ts +1 -0
  128. package/dist/mongo/mongodbQuerierPool.test.js +21 -0
  129. package/dist/mysql/index.d.ts +3 -0
  130. package/dist/mysql/index.js +4 -0
  131. package/dist/mysql/mysql2Querier.d.ts +17 -0
  132. package/dist/mysql/mysql2Querier.js +43 -0
  133. package/dist/mysql/mysql2Querier.test.d.ts +4 -0
  134. package/dist/mysql/mysql2Querier.test.js +16 -0
  135. package/dist/mysql/mysql2QuerierPool.d.ts +10 -0
  136. package/dist/mysql/mysql2QuerierPool.js +17 -0
  137. package/dist/mysql/mysql2QuerierPool.test.d.ts +5 -0
  138. package/dist/mysql/mysql2QuerierPool.test.js +16 -0
  139. package/dist/mysql/mysqlDialect.d.ts +5 -0
  140. package/dist/mysql/mysqlDialect.js +15 -0
  141. package/dist/namingStrategy/defaultNamingStrategy.d.ts +9 -0
  142. package/dist/namingStrategy/defaultNamingStrategy.js +15 -0
  143. package/dist/namingStrategy/index.d.ts +2 -0
  144. package/dist/namingStrategy/index.js +3 -0
  145. package/dist/namingStrategy/snakeCaseNamingStrategy.d.ts +8 -0
  146. package/dist/namingStrategy/snakeCaseNamingStrategy.js +14 -0
  147. package/{options.d.ts → dist/options.d.ts} +1 -1
  148. package/dist/options.js +14 -0
  149. package/dist/package.json +131 -0
  150. package/dist/postgres/index.d.ts +3 -0
  151. package/dist/postgres/index.js +4 -0
  152. package/dist/postgres/pgQuerier.d.ts +17 -0
  153. package/dist/postgres/pgQuerier.js +39 -0
  154. package/dist/postgres/pgQuerier.test.d.ts +4 -0
  155. package/dist/postgres/pgQuerier.test.js +20 -0
  156. package/dist/postgres/pgQuerierPool.d.ts +10 -0
  157. package/dist/postgres/pgQuerierPool.js +17 -0
  158. package/dist/postgres/pgQuerierPool.test.d.ts +5 -0
  159. package/dist/postgres/pgQuerierPool.test.js +23 -0
  160. package/dist/postgres/postgresDialect.d.ts +13 -0
  161. package/dist/postgres/postgresDialect.js +110 -0
  162. package/dist/querier/abstractQuerier-test.d.ts +45 -0
  163. package/dist/querier/abstractQuerier-test.js +461 -0
  164. package/dist/querier/abstractQuerier.d.ts +50 -0
  165. package/dist/querier/abstractQuerier.js +278 -0
  166. package/dist/querier/abstractQuerierPool-test.d.ts +9 -0
  167. package/dist/querier/abstractQuerierPool-test.js +18 -0
  168. package/dist/querier/abstractQuerierPool.d.ts +14 -0
  169. package/dist/querier/abstractQuerierPool.js +9 -0
  170. package/dist/querier/abstractSqlQuerier-test.d.ts +9 -0
  171. package/dist/querier/abstractSqlQuerier-test.js +16 -0
  172. package/dist/querier/abstractSqlQuerier.d.ts +28 -0
  173. package/dist/querier/abstractSqlQuerier.js +133 -0
  174. package/dist/querier/decorator/index.d.ts +3 -0
  175. package/dist/querier/decorator/index.js +4 -0
  176. package/dist/querier/decorator/injectQuerier.d.ts +3 -0
  177. package/dist/querier/decorator/injectQuerier.js +33 -0
  178. package/dist/querier/decorator/serialized.d.ts +6 -0
  179. package/dist/querier/decorator/serialized.js +14 -0
  180. package/{querier → dist/querier}/decorator/transactional.d.ts +1 -1
  181. package/dist/querier/decorator/transactional.js +48 -0
  182. package/dist/querier/index.d.ts +4 -0
  183. package/dist/querier/index.js +5 -0
  184. package/dist/repository/genericRepository.d.ts +20 -0
  185. package/dist/repository/genericRepository.js +51 -0
  186. package/dist/repository/index.d.ts +1 -0
  187. package/dist/repository/index.js +2 -0
  188. package/dist/sqlite/index.d.ts +3 -0
  189. package/dist/sqlite/index.js +4 -0
  190. package/dist/sqlite/sqliteDialect.d.ts +10 -0
  191. package/dist/sqlite/sqliteDialect.js +48 -0
  192. package/dist/sqlite/sqliteQuerier.d.ts +15 -0
  193. package/dist/sqlite/sqliteQuerier.js +33 -0
  194. package/dist/sqlite/sqliteQuerier.test.d.ts +5 -0
  195. package/dist/sqlite/sqliteQuerier.test.js +19 -0
  196. package/dist/sqlite/sqliteQuerierPool.d.ts +14 -0
  197. package/dist/sqlite/sqliteQuerierPool.js +34 -0
  198. package/dist/sqlite/sqliteQuerierPool.test.d.ts +5 -0
  199. package/dist/sqlite/sqliteQuerierPool.test.js +10 -0
  200. package/dist/test/entityMock.d.ts +164 -0
  201. package/dist/test/entityMock.js +554 -0
  202. package/dist/test/index.d.ts +3 -0
  203. package/dist/test/index.js +4 -0
  204. package/dist/test/it.util.d.ts +4 -0
  205. package/dist/test/it.util.js +55 -0
  206. package/dist/test/spec.util.d.ts +14 -0
  207. package/dist/test/spec.util.js +50 -0
  208. package/{type → dist/type}/entity.d.ts +97 -4
  209. package/dist/type/entity.js +5 -0
  210. package/dist/type/index.d.ts +9 -0
  211. package/dist/type/index.js +10 -0
  212. package/dist/type/migration.d.ts +213 -0
  213. package/dist/type/migration.js +2 -0
  214. package/dist/type/namingStrategy.d.ts +17 -0
  215. package/dist/type/namingStrategy.js +2 -0
  216. package/dist/type/querier.d.ts +96 -0
  217. package/dist/type/querier.js +11 -0
  218. package/{type → dist/type}/querierPool.d.ts +7 -3
  219. package/dist/type/querierPool.js +2 -0
  220. package/{type → dist/type}/query.d.ts +170 -108
  221. package/dist/type/query.js +9 -0
  222. package/{type → dist/type}/repository.d.ts +42 -35
  223. package/dist/type/repository.js +2 -0
  224. package/{type → dist/type}/universalQuerier.d.ts +50 -28
  225. package/dist/type/universalQuerier.js +2 -0
  226. package/dist/type/utility.d.ts +13 -0
  227. package/dist/type/utility.js +2 -0
  228. package/dist/util/dialect.util.d.ts +12 -0
  229. package/dist/util/dialect.util.js +93 -0
  230. package/dist/util/index.d.ts +5 -0
  231. package/dist/util/index.js +6 -0
  232. package/dist/util/object.util.d.ts +7 -0
  233. package/dist/util/object.util.js +19 -0
  234. package/dist/util/raw.d.ts +8 -0
  235. package/dist/util/raw.js +11 -0
  236. package/dist/util/sql.util.d.ts +13 -0
  237. package/dist/util/sql.util.js +78 -0
  238. package/{util → dist/util}/string.util.d.ts +1 -0
  239. package/dist/util/string.util.js +34 -0
  240. package/package.json +84 -16
  241. package/src/@types/index.d.ts +1 -0
  242. package/src/@types/jest.d.ts +6 -0
  243. package/src/browser/http/bus.spec.ts +22 -0
  244. package/src/browser/http/bus.ts +17 -0
  245. package/src/browser/http/http.spec.ts +70 -0
  246. package/src/browser/http/http.ts +55 -0
  247. package/src/browser/http/index.ts +2 -0
  248. package/src/browser/index.ts +4 -0
  249. package/src/browser/options.spec.ts +37 -0
  250. package/src/browser/options.ts +18 -0
  251. package/src/browser/querier/genericClientRepository.spec.ts +105 -0
  252. package/src/browser/querier/genericClientRepository.ts +49 -0
  253. package/src/browser/querier/httpQuerier.ts +82 -0
  254. package/src/browser/querier/index.ts +3 -0
  255. package/src/browser/querier/querier.util.spec.ts +35 -0
  256. package/src/browser/querier/querier.util.ts +18 -0
  257. package/src/browser/type/clientQuerier.ts +45 -0
  258. package/src/browser/type/clientQuerierPool.ts +5 -0
  259. package/src/browser/type/clientRepository.ts +22 -0
  260. package/src/browser/type/index.ts +4 -0
  261. package/src/browser/type/request.ts +25 -0
  262. package/src/dialect/abstractDialect.ts +28 -0
  263. package/src/dialect/abstractSqlDialect-spec.ts +1309 -0
  264. package/src/dialect/abstractSqlDialect.ts +805 -0
  265. package/src/dialect/index.ts +3 -0
  266. package/src/dialect/namingStrategy.spec.ts +52 -0
  267. package/src/dialect/queryContext.ts +69 -0
  268. package/src/entity/decorator/definition.spec.ts +736 -0
  269. package/src/entity/decorator/definition.ts +265 -0
  270. package/src/entity/decorator/entity.ts +8 -0
  271. package/src/entity/decorator/field.ts +9 -0
  272. package/src/entity/decorator/id.ts +9 -0
  273. package/src/entity/decorator/index.ts +5 -0
  274. package/src/entity/decorator/relation.spec.ts +41 -0
  275. package/src/entity/decorator/relation.ts +34 -0
  276. package/src/entity/index.ts +1 -0
  277. package/src/express/@types/express.d.ts +8 -0
  278. package/src/express/@types/index.d.ts +1 -0
  279. package/src/express/index.ts +2 -0
  280. package/src/express/querierMiddleware.ts +217 -0
  281. package/src/express/query.util.spec.ts +40 -0
  282. package/src/express/query.util.ts +21 -0
  283. package/src/index.ts +9 -0
  284. package/src/maria/index.ts +3 -0
  285. package/src/maria/mariaDialect.spec.ts +207 -0
  286. package/src/maria/mariaDialect.ts +42 -0
  287. package/src/maria/mariaQuerierPool.test.ts +23 -0
  288. package/src/maria/mariadbQuerier.test.ts +23 -0
  289. package/src/maria/mariadbQuerier.ts +45 -0
  290. package/src/maria/mariadbQuerierPool.ts +21 -0
  291. package/src/migrate/cli.ts +301 -0
  292. package/src/migrate/generator/index.ts +4 -0
  293. package/src/migrate/generator/mongoSchemaGenerator.spec.ts +112 -0
  294. package/src/migrate/generator/mongoSchemaGenerator.ts +115 -0
  295. package/src/migrate/generator/mysqlSchemaGenerator.spec.ts +34 -0
  296. package/src/migrate/generator/mysqlSchemaGenerator.ts +92 -0
  297. package/src/migrate/generator/postgresSchemaGenerator.spec.ts +44 -0
  298. package/src/migrate/generator/postgresSchemaGenerator.ts +127 -0
  299. package/src/migrate/generator/sqliteSchemaGenerator.spec.ts +33 -0
  300. package/src/migrate/generator/sqliteSchemaGenerator.ts +81 -0
  301. package/src/migrate/index.ts +41 -0
  302. package/src/migrate/introspection/index.ts +4 -0
  303. package/src/migrate/introspection/mongoIntrospector.spec.ts +75 -0
  304. package/src/migrate/introspection/mongoIntrospector.ts +47 -0
  305. package/src/migrate/introspection/mysqlIntrospector.spec.ts +113 -0
  306. package/src/migrate/introspection/mysqlIntrospector.ts +278 -0
  307. package/src/migrate/introspection/postgresIntrospector.spec.ts +112 -0
  308. package/src/migrate/introspection/postgresIntrospector.ts +329 -0
  309. package/src/migrate/introspection/sqliteIntrospector.spec.ts +112 -0
  310. package/src/migrate/introspection/sqliteIntrospector.ts +296 -0
  311. package/src/migrate/migrator-mongo.test.ts +54 -0
  312. package/src/migrate/migrator.spec.ts +255 -0
  313. package/src/migrate/migrator.test.ts +94 -0
  314. package/src/migrate/migrator.ts +719 -0
  315. package/src/migrate/namingStrategy.spec.ts +22 -0
  316. package/src/migrate/schemaGenerator-advanced.spec.ts +138 -0
  317. package/src/migrate/schemaGenerator.spec.ts +190 -0
  318. package/src/migrate/schemaGenerator.ts +478 -0
  319. package/src/migrate/storage/databaseStorage.spec.ts +69 -0
  320. package/src/migrate/storage/databaseStorage.ts +100 -0
  321. package/src/migrate/storage/index.ts +2 -0
  322. package/src/migrate/storage/jsonStorage.ts +58 -0
  323. package/src/migrate/type.ts +1 -0
  324. package/src/mongo/index.ts +3 -0
  325. package/src/mongo/mongoDialect.spec.ts +251 -0
  326. package/src/mongo/mongoDialect.ts +238 -0
  327. package/src/mongo/mongodbQuerier.test.ts +45 -0
  328. package/src/mongo/mongodbQuerier.ts +256 -0
  329. package/src/mongo/mongodbQuerierPool.test.ts +25 -0
  330. package/src/mongo/mongodbQuerierPool.ts +24 -0
  331. package/src/mysql/index.ts +3 -0
  332. package/src/mysql/mysql2Querier.test.ts +20 -0
  333. package/src/mysql/mysql2Querier.ts +49 -0
  334. package/src/mysql/mysql2QuerierPool.test.ts +20 -0
  335. package/src/mysql/mysql2QuerierPool.ts +21 -0
  336. package/src/mysql/mysqlDialect.spec.ts +20 -0
  337. package/src/mysql/mysqlDialect.ts +16 -0
  338. package/src/namingStrategy/defaultNamingStrategy.ts +18 -0
  339. package/src/namingStrategy/index.spec.ts +36 -0
  340. package/src/namingStrategy/index.ts +2 -0
  341. package/src/namingStrategy/snakeCaseNamingStrategy.ts +15 -0
  342. package/src/options.spec.ts +41 -0
  343. package/src/options.ts +18 -0
  344. package/src/postgres/index.ts +3 -0
  345. package/src/postgres/manual-types.d.ts +4 -0
  346. package/src/postgres/pgQuerier.test.ts +25 -0
  347. package/src/postgres/pgQuerier.ts +45 -0
  348. package/src/postgres/pgQuerierPool.test.ts +28 -0
  349. package/src/postgres/pgQuerierPool.ts +21 -0
  350. package/src/postgres/postgresDialect.spec.ts +428 -0
  351. package/src/postgres/postgresDialect.ts +144 -0
  352. package/src/querier/abstractQuerier-test.ts +584 -0
  353. package/src/querier/abstractQuerier.ts +353 -0
  354. package/src/querier/abstractQuerierPool-test.ts +20 -0
  355. package/src/querier/abstractQuerierPool.ts +18 -0
  356. package/src/querier/abstractSqlQuerier-spec.ts +979 -0
  357. package/src/querier/abstractSqlQuerier-test.ts +21 -0
  358. package/src/querier/abstractSqlQuerier.ts +138 -0
  359. package/src/querier/decorator/index.ts +3 -0
  360. package/src/querier/decorator/injectQuerier.spec.ts +74 -0
  361. package/src/querier/decorator/injectQuerier.ts +45 -0
  362. package/src/querier/decorator/serialized.spec.ts +98 -0
  363. package/src/querier/decorator/serialized.ts +13 -0
  364. package/src/querier/decorator/transactional.spec.ts +240 -0
  365. package/src/querier/decorator/transactional.ts +56 -0
  366. package/src/querier/index.ts +4 -0
  367. package/src/repository/genericRepository.spec.ts +111 -0
  368. package/src/repository/genericRepository.ts +74 -0
  369. package/src/repository/index.ts +1 -0
  370. package/src/sqlite/index.ts +3 -0
  371. package/src/sqlite/manual-types.d.ts +4 -0
  372. package/src/sqlite/sqliteDialect.spec.ts +155 -0
  373. package/src/sqlite/sqliteDialect.ts +76 -0
  374. package/src/sqlite/sqliteQuerier.spec.ts +36 -0
  375. package/src/sqlite/sqliteQuerier.test.ts +21 -0
  376. package/src/sqlite/sqliteQuerier.ts +37 -0
  377. package/src/sqlite/sqliteQuerierPool.test.ts +12 -0
  378. package/src/sqlite/sqliteQuerierPool.ts +38 -0
  379. package/src/test/entityMock.ts +375 -0
  380. package/src/test/index.ts +3 -0
  381. package/src/test/it.util.ts +69 -0
  382. package/src/test/spec.util.ts +57 -0
  383. package/src/type/entity.ts +218 -0
  384. package/src/type/index.ts +9 -0
  385. package/src/type/migration.ts +241 -0
  386. package/src/type/namingStrategy.ts +17 -0
  387. package/src/type/querier.ts +143 -0
  388. package/src/type/querierPool.ts +26 -0
  389. package/src/type/query.ts +506 -0
  390. package/src/type/repository.ts +142 -0
  391. package/src/type/universalQuerier.ts +133 -0
  392. package/src/type/utility.ts +21 -0
  393. package/src/util/dialect.util-extra.spec.ts +96 -0
  394. package/src/util/dialect.util.spec.ts +23 -0
  395. package/src/util/dialect.util.ts +134 -0
  396. package/src/util/index.ts +5 -0
  397. package/src/util/object.util.spec.ts +29 -0
  398. package/src/util/object.util.ts +27 -0
  399. package/src/util/raw.ts +11 -0
  400. package/src/util/sql.util-extra.spec.ts +17 -0
  401. package/src/util/sql.util.spec.ts +208 -0
  402. package/src/util/sql.util.ts +104 -0
  403. package/src/util/string.util.spec.ts +46 -0
  404. package/src/util/string.util.ts +35 -0
  405. package/tsconfig.build.json +5 -0
  406. package/tsconfig.json +8 -0
  407. package/README.md +0 -177
  408. package/dialect/abstractSqlDialect.d.ts +0 -30
  409. package/dialect/abstractSqlDialect.js +0 -365
  410. package/dialect/index.d.ts +0 -4
  411. package/dialect/index.js +0 -8
  412. package/dialect/mysqlDialect.d.ts +0 -6
  413. package/dialect/mysqlDialect.js +0 -21
  414. package/dialect/postgresDialect.d.ts +0 -8
  415. package/dialect/postgresDialect.js +0 -44
  416. package/dialect/sqliteDialect.d.ts +0 -4
  417. package/dialect/sqliteDialect.js +0 -11
  418. package/entity/decorator/definition.js +0 -223
  419. package/entity/decorator/entity.js +0 -11
  420. package/entity/decorator/field.js +0 -12
  421. package/entity/decorator/id.js +0 -12
  422. package/entity/decorator/index.d.ts +0 -5
  423. package/entity/decorator/index.js +0 -12
  424. package/entity/decorator/relation.js +0 -27
  425. package/entity/index.d.ts +0 -1
  426. package/entity/index.js +0 -5
  427. package/index.d.ts +0 -1
  428. package/index.js +0 -5
  429. package/options.js +0 -20
  430. package/querier/abstractQuerier.d.ts +0 -30
  431. package/querier/abstractQuerier.js +0 -230
  432. package/querier/abstractSqlQuerier.d.ts +0 -27
  433. package/querier/abstractSqlQuerier.js +0 -88
  434. package/querier/decorator/index.d.ts +0 -2
  435. package/querier/decorator/index.js +0 -6
  436. package/querier/decorator/injectQuerier.d.ts +0 -3
  437. package/querier/decorator/injectQuerier.js +0 -39
  438. package/querier/decorator/transactional.js +0 -52
  439. package/querier/index.d.ts +0 -3
  440. package/querier/index.js +0 -7
  441. package/repository/genericRepository.d.ts +0 -19
  442. package/repository/genericRepository.js +0 -52
  443. package/repository/index.d.ts +0 -1
  444. package/repository/index.js +0 -5
  445. package/type/entity.js +0 -5
  446. package/type/index.d.ts +0 -7
  447. package/type/index.js +0 -11
  448. package/type/querier.d.ts +0 -53
  449. package/type/querier.js +0 -3
  450. package/type/querierPool.js +0 -3
  451. package/type/query.js +0 -13
  452. package/type/repository.js +0 -3
  453. package/type/universalQuerier.js +0 -3
  454. package/type/utility.d.ts +0 -12
  455. package/type/utility.js +0 -3
  456. package/util/dialect.util.d.ts +0 -17
  457. package/util/dialect.util.js +0 -114
  458. package/util/index.d.ts +0 -5
  459. package/util/index.js +0 -9
  460. package/util/object.util.d.ts +0 -3
  461. package/util/object.util.js +0 -22
  462. package/util/raw.d.ts +0 -2
  463. package/util/raw.js +0 -9
  464. package/util/sql.util.d.ts +0 -2
  465. package/util/sql.util.js +0 -55
  466. package/util/string.util.js +0 -20
@@ -0,0 +1,133 @@
1
+ import type { IdValue } from './entity.js';
2
+ import type { Query, QueryConflictPaths, QueryOne, QueryOptions, QuerySearch } from './query.js';
3
+ import type { UniversalRepository } from './repository.js';
4
+ import type { Type } from './utility.js';
5
+
6
+ /**
7
+ * A `querier` allows to interact with the datasource to perform persistence operations on any entity.
8
+ */
9
+ export interface UniversalQuerier {
10
+ /**
11
+ * obtains the record with the given primary key.
12
+ * @param entity the target entity
13
+ * @param id the primary key value
14
+ * @param q the additional criteria options
15
+ * @return the record
16
+ */
17
+ findOneById<E>(entity: Type<E>, id: IdValue<E>, q?: QueryOne<E>): Promise<unknown>;
18
+
19
+ /**
20
+ * obtains the first record matching the given search parameters.
21
+ * @param entity the target entity
22
+ * @param q the criteria options
23
+ * @return the record
24
+ */
25
+ findOne<E>(entity: Type<E>, q: QueryOne<E>): Promise<unknown>;
26
+
27
+ /**
28
+ * obtains the records matching the given search parameters.
29
+ * @param entity the target entity
30
+ * @param q the criteria options
31
+ * @return the records
32
+ */
33
+ findMany<E>(entity: Type<E>, q: Query<E>): Promise<unknown>;
34
+
35
+ /**
36
+ * obtains the records matching the given search parameters,
37
+ * also counts the number of matches ignoring pagination.
38
+ * @param entity the target entity
39
+ * @param q the criteria options
40
+ * @return the records and the count
41
+ */
42
+ findManyAndCount<E>(entity: Type<E>, q: Query<E>): Promise<unknown>;
43
+
44
+ /**
45
+ * counts the number of records matching the given search parameters.
46
+ * @param entity the target entity
47
+ * @param q the search options
48
+ * @return the count
49
+ */
50
+ count<E>(entity: Type<E>, q: QuerySearch<E>): Promise<unknown>;
51
+
52
+ /**
53
+ * inserts a record.
54
+ * @param entity the entity to persist on
55
+ * @param payload the data to be persisted
56
+ * @return the ID
57
+ */
58
+ insertOne<E>(entity: Type<E>, payload: E): Promise<unknown>;
59
+
60
+ /**
61
+ * Inserts many records.
62
+ * @param entity the entity to persist on
63
+ * @param payload the data to be persisted
64
+ * @return the IDs
65
+ */
66
+ insertMany?<E>(entity: Type<E>, payload: E[]): Promise<unknown>;
67
+
68
+ /**
69
+ * updates a record partially.
70
+ * @param entity the entity to persist on
71
+ * @param id the primary key of the record to be updated
72
+ * @param payload the data to be persisted
73
+ * @return the number of affected records
74
+ */
75
+ updateOneById<E>(entity: Type<E>, id: IdValue<E>, payload: E): Promise<unknown>;
76
+
77
+ /**
78
+ * updates many records partially.
79
+ * @param entity the entity to persist on
80
+ * @param q the criteria to look for the records
81
+ * @param payload the data to be persisted
82
+ * @return the number of affected records
83
+ */
84
+ updateMany?<E>(entity: Type<E>, q: QuerySearch<E>, payload: E): Promise<unknown>;
85
+
86
+ /**
87
+ * Insert or update a record given a search criteria.
88
+ * @param entity the entity to persist on
89
+ * @param conflictPaths the keys to use for the unique search
90
+ * @param payload the data to be persisted
91
+ * @return void
92
+ */
93
+ upsertOne?<E>(entity: Type<E>, conflictPaths: QueryConflictPaths<E>, payload: E): Promise<unknown>;
94
+
95
+ /**
96
+ * insert or update a record.
97
+ * @param entity the entity to persist on
98
+ * @param payload the data to be persisted
99
+ * @return the ID
100
+ */
101
+ saveOne<E>(entity: Type<E>, payload: E): Promise<unknown>;
102
+
103
+ /**
104
+ * Insert or update records.
105
+ * @param entity the entity to persist on
106
+ * @param payload the data to be persisted
107
+ * @return the IDs
108
+ */
109
+ saveMany?<E>(entity: Type<E>, payload: E[]): Promise<unknown>;
110
+
111
+ /**
112
+ * delete or SoftDelete a record.
113
+ * @param entity the entity to persist on
114
+ * @param id the primary key of the record
115
+ * @return the number of affected records
116
+ */
117
+ deleteOneById<E>(entity: Type<E>, id: IdValue<E>, opts?: QueryOptions): Promise<unknown>;
118
+
119
+ /**
120
+ * delete or SoftDelete records.
121
+ * @param entity the entity to persist on
122
+ * @param q the criteria to look for the records
123
+ * @return the number of affected records
124
+ */
125
+ deleteMany<E>(entity: Type<E>, q: QuerySearch<E>, opts?: QueryOptions): Promise<unknown>;
126
+
127
+ /**
128
+ * get a repository for the given entity.
129
+ * @param entity the entity to get the repository for
130
+ * @return the repository
131
+ */
132
+ getRepository<E>(entity: Type<E>): UniversalRepository<E>;
133
+ }
@@ -0,0 +1,21 @@
1
+ export type Type<T> = new (...args: unknown[]) => T;
2
+
3
+ export type BooleanLike = boolean | 0 | 1;
4
+
5
+ export type MongoId = {
6
+ toHexString: () => string;
7
+ };
8
+
9
+ export type Scalar = string | number | boolean | bigint | Date | RegExp | Buffer | MongoId;
10
+
11
+ export type ExpandScalar<T> = null | (T extends Date ? Date | string : T);
12
+
13
+ export type Writable<T> = { -readonly [K in keyof T]: T[K] };
14
+
15
+ export type Unpacked<T> = T extends (infer U)[]
16
+ ? U
17
+ : T extends (...args: unknown[]) => infer U
18
+ ? U
19
+ : T extends Promise<infer U>
20
+ ? U
21
+ : T;
@@ -0,0 +1,96 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { Entity, Field, getMeta, Id, OneToMany } from '../entity/index.js';
3
+ import { QueryRaw } from '../type/index.js';
4
+ import {
5
+ buildSortMap,
6
+ buldQueryWhereAsMap,
7
+ fillOnFields,
8
+ filterFieldKeys,
9
+ filterPersistableRelationKeys,
10
+ filterRelationKeys,
11
+ getFieldCallbackValue,
12
+ isCascadable,
13
+ isSelectingRelations,
14
+ } from './dialect.util.js';
15
+
16
+ @Entity()
17
+ class DialectUser {
18
+ @Id() id?: number;
19
+ @Field({ updatable: false }) readonlyProp?: string;
20
+ @Field({ virtual: new QueryRaw('1') }) virtualProp?: string;
21
+ @Field({ onInsert: () => 'inserted', onUpdate: 'updated' }) callbackProp?: string;
22
+ @OneToMany({ entity: () => DialectPost, mappedBy: 'user', cascade: true }) posts?: DialectPost[];
23
+ }
24
+
25
+ @Entity()
26
+ class DialectPost {
27
+ @Id() id?: number;
28
+ @Field() user?: DialectUser;
29
+ }
30
+
31
+ describe('dialect.util', () => {
32
+ const meta = getMeta(DialectUser);
33
+
34
+ it('filterFieldKeys should filter virtual and non-updatable keys', () => {
35
+ const payload = { id: 1, readonlyProp: 'val', virtualProp: 'val', other: 'val' } as DialectUser;
36
+ const insertKeys = filterFieldKeys(meta, payload, 'onInsert');
37
+ expect(insertKeys).toContain('readonlyProp');
38
+ expect(insertKeys).not.toContain('virtualProp');
39
+
40
+ const updateKeys = filterFieldKeys(meta, payload, 'onUpdate');
41
+ expect(updateKeys).not.toContain('readonlyProp');
42
+ expect(updateKeys).not.toContain('virtualProp');
43
+ });
44
+
45
+ it('getFieldCallbackValue should handle functions and constants', () => {
46
+ expect(getFieldCallbackValue(() => 'test')).toBe('test');
47
+ expect(getFieldCallbackValue('constant')).toBe('constant');
48
+ });
49
+
50
+ it('fillOnFields should populate callback fields', () => {
51
+ const payload = { id: 1 } as DialectUser;
52
+ const filled = fillOnFields(meta, { ...payload }, 'onInsert');
53
+ expect(filled[0].callbackProp).toBe('inserted');
54
+
55
+ const updated = fillOnFields(meta, { ...payload }, 'onUpdate');
56
+ expect(updated[0].callbackProp).toBe('updated');
57
+ });
58
+
59
+ it('isCascadable should check action', () => {
60
+ expect(isCascadable('persist', true)).toBe(true);
61
+ expect(isCascadable('persist', false)).toBe(false);
62
+ expect(isCascadable('persist', 'persist')).toBe(true);
63
+ expect(isCascadable('persist', 'delete')).toBe(false);
64
+ });
65
+
66
+ it('filterPersistableRelationKeys should filter by cascade', () => {
67
+ const payload = { posts: [] } as DialectUser;
68
+ const keys = filterPersistableRelationKeys(meta, payload, 'persist');
69
+ expect(keys).toContain('posts');
70
+ });
71
+
72
+ it('filterRelationKeys should return relation keys from select', () => {
73
+ const select = { id: true, posts: true } as import('../type/index.js').QuerySelect<DialectUser>;
74
+ const keys = filterRelationKeys(meta, select);
75
+ expect(keys).toContain('posts');
76
+ expect(keys).not.toContain('id');
77
+ });
78
+
79
+ it('isSelectingRelations should check if any relation is selected', () => {
80
+ expect(isSelectingRelations(meta, { posts: true } as any)).toBe(true);
81
+ expect(isSelectingRelations(meta, { id: true } as any)).toBe(false);
82
+ });
83
+
84
+ it('buildSortMap should handle arrays and objects', () => {
85
+ expect(buildSortMap({ id: 1 } as any)).toEqual({ id: 1 });
86
+ expect(buildSortMap([['id', 1], { field: 'id', sort: -1 }] as any)).toEqual({ id: -1 });
87
+ });
88
+
89
+ it('buldQueryWhereAsMap should handle various types', () => {
90
+ expect(buldQueryWhereAsMap(meta, 123)).toEqual({ id: 123 });
91
+ expect(buldQueryWhereAsMap(meta, [1, 2])).toEqual({ id: [1, 2] });
92
+ const raw = new QueryRaw('test');
93
+ expect(buldQueryWhereAsMap(meta, raw)).toEqual({ $and: [raw] });
94
+ expect(buldQueryWhereAsMap(meta, { id: 1 } as any)).toEqual({ id: 1 });
95
+ });
96
+ });
@@ -0,0 +1,23 @@
1
+ import { expect, it } from 'bun:test';
2
+ import { getMeta } from '../entity/decorator/index.js';
3
+ import { User } from '../test/entityMock.js';
4
+ import { augmentWhere } from './dialect.util.js';
5
+ import { raw } from './raw.js';
6
+
7
+ it('augmentWhere empty', () => {
8
+ const meta = getMeta(User);
9
+ expect(augmentWhere(meta)).toEqual({});
10
+ expect(augmentWhere(meta, {})).toEqual({});
11
+ expect(augmentWhere(meta, {}, {})).toEqual({});
12
+ });
13
+
14
+ it('augmentWhere', () => {
15
+ const meta = getMeta(User);
16
+ expect(augmentWhere(meta, { name: 'a' }, { name: 'b' })).toEqual({ name: 'b' });
17
+ expect(augmentWhere(meta, { name: 'a' }, { id: 1 })).toEqual({ name: 'a', id: 1 });
18
+ expect(augmentWhere(meta, { name: 'a' }, { $and: [1, 2] })).toEqual({ name: 'a', $and: [1, 2] });
19
+ expect(augmentWhere(meta, 1, { $or: [2, 3] })).toEqual({ id: 1, $or: [2, 3] });
20
+ const rawFilter = raw(() => 'a > 1');
21
+ expect(augmentWhere(meta, rawFilter, 1)).toEqual({ $and: [rawFilter], id: 1 });
22
+ expect(augmentWhere(meta, 1, rawFilter)).toEqual({ id: 1, $and: [rawFilter] });
23
+ });
@@ -0,0 +1,134 @@
1
+ import {
2
+ type CascadeType,
3
+ type EntityMeta,
4
+ type FieldKey,
5
+ type FieldOptions,
6
+ type IdValue,
7
+ type Key,
8
+ type MongoId,
9
+ type OnFieldCallback,
10
+ QueryRaw,
11
+ type QuerySelect,
12
+ type QuerySort,
13
+ type QuerySortMap,
14
+ type QueryWhere,
15
+ type QueryWhereMap,
16
+ type RelationKey,
17
+ } from '../type/index.js';
18
+ import { getKeys } from './object.util.js';
19
+
20
+ export type CallbackKey = keyof Pick<FieldOptions, 'onInsert' | 'onUpdate' | 'onDelete'>;
21
+
22
+ export function filterFieldKeys<E>(meta: EntityMeta<E>, payload: E, callbackKey: CallbackKey): FieldKey<E>[] {
23
+ const persistableKeys = getKeys(payload).filter((key) => {
24
+ const fieldOpts = meta.fields[key as FieldKey<E>];
25
+ return fieldOpts && !fieldOpts.virtual && (callbackKey !== 'onUpdate' || (fieldOpts.updatable ?? true));
26
+ }) as FieldKey<E>[];
27
+ return persistableKeys;
28
+ }
29
+
30
+ export function getFieldCallbackValue(val: OnFieldCallback) {
31
+ return typeof val === 'function' ? val() : val;
32
+ }
33
+
34
+ export function fillOnFields<E>(meta: EntityMeta<E>, payload: E | E[], callbackKey: CallbackKey): E[] {
35
+ const payloads = Array.isArray(payload) ? payload : [payload];
36
+ const keys = getKeys(meta.fields).filter((key) => meta.fields[key][callbackKey]);
37
+ return payloads.map((it) => {
38
+ for (const key of keys) {
39
+ if (it[key] === undefined) {
40
+ it[key] = getFieldCallbackValue(meta.fields[key][callbackKey]);
41
+ }
42
+ }
43
+ return it;
44
+ });
45
+ }
46
+
47
+ export function filterPersistableRelationKeys<E>(
48
+ meta: EntityMeta<E>,
49
+ payload: E,
50
+ action: CascadeType,
51
+ ): RelationKey<E>[] {
52
+ const keys = getKeys(payload);
53
+ return keys.filter((key) => {
54
+ const relOpts = meta.relations[key as RelationKey<E>];
55
+ return relOpts && isCascadable(action, relOpts.cascade);
56
+ }) as RelationKey<E>[];
57
+ }
58
+
59
+ export function isCascadable(action: CascadeType, configuration?: boolean | CascadeType): boolean {
60
+ if (typeof configuration === 'boolean') {
61
+ return configuration;
62
+ }
63
+ return configuration === action;
64
+ }
65
+
66
+ export function filterRelationKeys<E>(meta: EntityMeta<E>, select: QuerySelect<E>): RelationKey<E>[] {
67
+ const keys = filterPositiveKeys(select);
68
+ return keys.filter((key) => key in meta.relations) as RelationKey<E>[];
69
+ }
70
+
71
+ export function isSelectingRelations<E>(meta: EntityMeta<E>, select: QuerySelect<E>): boolean {
72
+ const keys = filterPositiveKeys(select);
73
+ return keys.some((key) => key in meta.relations);
74
+ }
75
+
76
+ function filterPositiveKeys<E>(select: QuerySelect<E>): Key<E>[] {
77
+ if (Array.isArray(select)) {
78
+ return select as Key<E>[];
79
+ }
80
+ return getKeys(select).filter((key) => select[key]) as Key<E>[];
81
+ }
82
+
83
+ export function buildSortMap<E>(sort: QuerySort<E>): QuerySortMap<E> {
84
+ if (Array.isArray(sort)) {
85
+ return sort.reduce(
86
+ (acc, it) => {
87
+ if (Array.isArray(it)) {
88
+ acc[it[0]] = it[1];
89
+ } else {
90
+ acc[it.field] = it.sort;
91
+ }
92
+ return acc;
93
+ },
94
+ {} as QuerySortMap<E>,
95
+ );
96
+ }
97
+ return sort as QuerySortMap<E>;
98
+ }
99
+
100
+ export function augmentWhere<E>(
101
+ meta: EntityMeta<E>,
102
+ target: QueryWhere<E> = {},
103
+ source: QueryWhere<E> = {},
104
+ ): QueryWhere<E> {
105
+ const targetComparison = buldQueryWhereAsMap(meta, target);
106
+ const sourceComparison = buldQueryWhereAsMap(meta, source);
107
+ return {
108
+ ...targetComparison,
109
+ ...sourceComparison,
110
+ };
111
+ }
112
+
113
+ export function buldQueryWhereAsMap<E>(meta: EntityMeta<E>, filter: QueryWhere<E> = {}): QueryWhereMap<E> {
114
+ if (filter instanceof QueryRaw) {
115
+ return { $and: [filter] } as QueryWhereMap<E>;
116
+ }
117
+ if (isIdValue(filter)) {
118
+ return {
119
+ [meta.id]: filter,
120
+ } as QueryWhereMap<E>;
121
+ }
122
+ return filter as QueryWhereMap<E>;
123
+ }
124
+
125
+ function isIdValue<E>(filter: QueryWhere<E>): filter is IdValue<E> | IdValue<E>[] {
126
+ const type = typeof filter;
127
+ return (
128
+ type === 'string' ||
129
+ type === 'number' ||
130
+ type === 'bigint' ||
131
+ typeof (filter as MongoId).toHexString === 'function' ||
132
+ Array.isArray(filter)
133
+ );
134
+ }
@@ -0,0 +1,5 @@
1
+ export * from './dialect.util.js';
2
+ export * from './object.util.js';
3
+ export * from './raw.js';
4
+ export * from './sql.util.js';
5
+ export * from './string.util.js';
@@ -0,0 +1,29 @@
1
+ import { expect, it } from 'bun:test';
2
+ import { clone, getKeys, hasKeys } from './object.util.js';
3
+
4
+ it('clone', () => {
5
+ expect(clone({})).toEqual({});
6
+ expect(clone({ a: 1 })).toEqual({ a: 1 });
7
+ expect(clone([])).toEqual([]);
8
+ expect(clone([{ a: 1 }])).toEqual([{ a: 1 }]);
9
+
10
+ const source = [{ a: 1 }];
11
+ const cloned = clone(source);
12
+
13
+ expect(cloned[0]).not.toBe(source[0]);
14
+ expect(cloned).not.toBe(source);
15
+ expect(cloned[0]).toEqual(source[0]);
16
+ expect(cloned).toEqual(source);
17
+ });
18
+
19
+ it('hasKeys', () => {
20
+ expect(hasKeys({})).toBe(false);
21
+ expect(hasKeys({ a: 1 })).toBe(true);
22
+ });
23
+
24
+ it('getKeys', () => {
25
+ expect(getKeys(undefined)).toEqual([]);
26
+ expect(getKeys(null)).toEqual([]);
27
+ expect(getKeys({})).toEqual([]);
28
+ expect(getKeys({ a: 1 })).toEqual(['a']);
29
+ });
@@ -0,0 +1,27 @@
1
+ import type { FieldKey, FieldOptions } from '../type/index.js';
2
+
3
+ export function clone<T>(value: T): T {
4
+ if (typeof value !== 'object' || value === null) {
5
+ return value;
6
+ }
7
+ if (Array.isArray(value)) {
8
+ return value.map((it) => clone(it)) as unknown as T;
9
+ }
10
+ return { ...value };
11
+ }
12
+
13
+ export function hasKeys<T>(obj: T): boolean {
14
+ return getKeys(obj).length > 0;
15
+ }
16
+
17
+ export function getKeys<T>(obj: T): string[] {
18
+ return obj ? Object.keys(obj) : [];
19
+ }
20
+
21
+ export function getFieldKeys<E>(
22
+ fields: {
23
+ [K in FieldKey<E>]?: FieldOptions;
24
+ },
25
+ ): FieldKey<E>[] {
26
+ return getKeys(fields).filter((field) => fields[field as FieldKey<E>].eager ?? true) as FieldKey<E>[];
27
+ }
@@ -0,0 +1,11 @@
1
+ import { QueryRaw, type QueryRawFn, type Scalar } from '../type/index.js';
2
+
3
+ /**
4
+ * Allow using any raw value that shouldn't be automatically escaped by the ORM.
5
+ * @param value the raw value
6
+ * @param alias optional alias
7
+ * @returns a QueryRaw instance
8
+ */
9
+ export function raw(value: Scalar | QueryRawFn, alias?: string): any {
10
+ return new QueryRaw(value, alias);
11
+ }
@@ -0,0 +1,17 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { obtainAttrsPaths } from './sql.util.js';
3
+
4
+ describe('sql.util extras', () => {
5
+ it('obtainAttrsPaths should handle nested objects with depth', () => {
6
+ const res = obtainAttrsPaths({
7
+ 'user.profile.name': 1,
8
+ 'user.email': 1,
9
+ user_profile_name: 1,
10
+ });
11
+ expect(res).toEqual({
12
+ 'user.profile.name': ['user', 'profile', 'name'],
13
+ 'user.email': ['user', 'email'],
14
+ user_profile_name: ['user', 'profile', 'name'],
15
+ });
16
+ });
17
+ });