uql-orm 0.1.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 (540) hide show
  1. package/CHANGELOG.md +521 -0
  2. package/LICENSE.md +22 -0
  3. package/README.md +560 -0
  4. package/dist/browser/cc-BEf4wTUm.js +535 -0
  5. package/dist/browser/cc-BEf4wTUm.js.map +1 -0
  6. package/dist/browser/http/bus.d.ts +4 -0
  7. package/dist/browser/http/bus.d.ts.map +1 -0
  8. package/dist/browser/http/bus.js +14 -0
  9. package/dist/browser/http/bus.js.map +1 -0
  10. package/dist/browser/http/http.d.ts +7 -0
  11. package/dist/browser/http/http.d.ts.map +1 -0
  12. package/dist/browser/http/http.js +45 -0
  13. package/dist/browser/http/http.js.map +1 -0
  14. package/dist/browser/http/index.d.ts +3 -0
  15. package/dist/browser/http/index.d.ts.map +1 -0
  16. package/dist/browser/http/index.js +3 -0
  17. package/dist/browser/http/index.js.map +1 -0
  18. package/dist/browser/index.d.ts +5 -0
  19. package/dist/browser/index.d.ts.map +1 -0
  20. package/dist/browser/index.js +5 -0
  21. package/dist/browser/index.js.map +1 -0
  22. package/dist/browser/options.d.ts +5 -0
  23. package/dist/browser/options.d.ts.map +1 -0
  24. package/dist/browser/options.js +14 -0
  25. package/dist/browser/options.js.map +1 -0
  26. package/dist/browser/querier/httpQuerier.d.ts +20 -0
  27. package/dist/browser/querier/httpQuerier.d.ts.map +1 -0
  28. package/dist/browser/querier/httpQuerier.js +68 -0
  29. package/dist/browser/querier/httpQuerier.js.map +1 -0
  30. package/dist/browser/querier/index.d.ts +3 -0
  31. package/dist/browser/querier/index.d.ts.map +1 -0
  32. package/dist/browser/querier/index.js +3 -0
  33. package/dist/browser/querier/index.js.map +1 -0
  34. package/dist/browser/querier/querier.util.d.ts +3 -0
  35. package/dist/browser/querier/querier.util.d.ts.map +1 -0
  36. package/dist/browser/querier/querier.util.js +17 -0
  37. package/dist/browser/querier/querier.util.js.map +1 -0
  38. package/dist/browser/type/clientQuerier.d.ts +24 -0
  39. package/dist/browser/type/clientQuerier.d.ts.map +1 -0
  40. package/dist/browser/type/clientQuerier.js +2 -0
  41. package/dist/browser/type/clientQuerier.js.map +1 -0
  42. package/dist/browser/type/clientQuerierPool.d.ts +5 -0
  43. package/dist/browser/type/clientQuerierPool.d.ts.map +1 -0
  44. package/dist/browser/type/clientQuerierPool.js +2 -0
  45. package/dist/browser/type/clientQuerierPool.js.map +1 -0
  46. package/dist/browser/type/index.d.ts +4 -0
  47. package/dist/browser/type/index.d.ts.map +1 -0
  48. package/dist/browser/type/index.js +4 -0
  49. package/dist/browser/type/index.js.map +1 -0
  50. package/dist/browser/type/request.d.ts +29 -0
  51. package/dist/browser/type/request.d.ts.map +1 -0
  52. package/dist/browser/type/request.js +2 -0
  53. package/dist/browser/type/request.js.map +1 -0
  54. package/dist/browser/uql-browser.min.js +4818 -0
  55. package/dist/browser/uql-browser.min.js.map +1 -0
  56. package/dist/d1/d1Querier.d.ts +45 -0
  57. package/dist/d1/d1Querier.d.ts.map +1 -0
  58. package/dist/d1/d1Querier.js +31 -0
  59. package/dist/d1/d1Querier.js.map +1 -0
  60. package/dist/d1/d1QuerierPool.d.ts +10 -0
  61. package/dist/d1/d1QuerierPool.d.ts.map +1 -0
  62. package/dist/d1/d1QuerierPool.js +16 -0
  63. package/dist/d1/d1QuerierPool.js.map +1 -0
  64. package/dist/d1/index.d.ts +3 -0
  65. package/dist/d1/index.d.ts.map +1 -0
  66. package/dist/d1/index.js +3 -0
  67. package/dist/d1/index.js.map +1 -0
  68. package/dist/dialect/abstractDialect.d.ts +22 -0
  69. package/dist/dialect/abstractDialect.d.ts.map +1 -0
  70. package/dist/dialect/abstractDialect.js +37 -0
  71. package/dist/dialect/abstractDialect.js.map +1 -0
  72. package/dist/dialect/abstractSqlDialect.d.ts +140 -0
  73. package/dist/dialect/abstractSqlDialect.d.ts.map +1 -0
  74. package/dist/dialect/abstractSqlDialect.js +957 -0
  75. package/dist/dialect/abstractSqlDialect.js.map +1 -0
  76. package/dist/dialect/dialectConfig.d.ts +23 -0
  77. package/dist/dialect/dialectConfig.d.ts.map +1 -0
  78. package/dist/dialect/dialectConfig.js +96 -0
  79. package/dist/dialect/dialectConfig.js.map +1 -0
  80. package/dist/dialect/index.d.ts +5 -0
  81. package/dist/dialect/index.d.ts.map +1 -0
  82. package/dist/dialect/index.js +5 -0
  83. package/dist/dialect/index.js.map +1 -0
  84. package/dist/dialect/queryContext.d.ts +49 -0
  85. package/dist/dialect/queryContext.d.ts.map +1 -0
  86. package/dist/dialect/queryContext.js +65 -0
  87. package/dist/dialect/queryContext.js.map +1 -0
  88. package/dist/entity/decorator/definition.d.ts +11 -0
  89. package/dist/entity/decorator/definition.d.ts.map +1 -0
  90. package/dist/entity/decorator/definition.js +247 -0
  91. package/dist/entity/decorator/definition.js.map +1 -0
  92. package/dist/entity/decorator/entity.d.ts +3 -0
  93. package/dist/entity/decorator/entity.d.ts.map +1 -0
  94. package/dist/entity/decorator/entity.js +7 -0
  95. package/dist/entity/decorator/entity.js.map +1 -0
  96. package/dist/entity/decorator/field.d.ts +3 -0
  97. package/dist/entity/decorator/field.d.ts.map +1 -0
  98. package/dist/entity/decorator/field.js +8 -0
  99. package/dist/entity/decorator/field.js.map +1 -0
  100. package/dist/entity/decorator/hook.d.ts +8 -0
  101. package/dist/entity/decorator/hook.d.ts.map +1 -0
  102. package/dist/entity/decorator/hook.js +15 -0
  103. package/dist/entity/decorator/hook.js.map +1 -0
  104. package/dist/entity/decorator/id.d.ts +3 -0
  105. package/dist/entity/decorator/id.d.ts.map +1 -0
  106. package/dist/entity/decorator/id.js +8 -0
  107. package/dist/entity/decorator/id.js.map +1 -0
  108. package/dist/entity/decorator/index-decorator.d.ts +36 -0
  109. package/dist/entity/decorator/index-decorator.d.ts.map +1 -0
  110. package/dist/entity/decorator/index-decorator.js +52 -0
  111. package/dist/entity/decorator/index-decorator.js.map +1 -0
  112. package/dist/entity/decorator/index.d.ts +8 -0
  113. package/dist/entity/decorator/index.d.ts.map +1 -0
  114. package/dist/entity/decorator/index.js +8 -0
  115. package/dist/entity/decorator/index.js.map +1 -0
  116. package/dist/entity/decorator/relation.d.ts +9 -0
  117. package/dist/entity/decorator/relation.d.ts.map +1 -0
  118. package/dist/entity/decorator/relation.js +20 -0
  119. package/dist/entity/decorator/relation.js.map +1 -0
  120. package/dist/entity/index.d.ts +2 -0
  121. package/dist/entity/index.d.ts.map +1 -0
  122. package/dist/entity/index.js +2 -0
  123. package/dist/entity/index.js.map +1 -0
  124. package/dist/express/index.d.ts +3 -0
  125. package/dist/express/index.d.ts.map +1 -0
  126. package/dist/express/index.js +3 -0
  127. package/dist/express/index.js.map +1 -0
  128. package/dist/express/querierMiddleware.d.ts +26 -0
  129. package/dist/express/querierMiddleware.d.ts.map +1 -0
  130. package/dist/express/querierMiddleware.js +149 -0
  131. package/dist/express/querierMiddleware.js.map +1 -0
  132. package/dist/express/query.util.d.ts +7 -0
  133. package/dist/express/query.util.d.ts.map +1 -0
  134. package/dist/express/query.util.js +28 -0
  135. package/dist/express/query.util.js.map +1 -0
  136. package/dist/index.d.ts +8 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +8 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/libsql/index.d.ts +3 -0
  141. package/dist/libsql/index.d.ts.map +1 -0
  142. package/dist/libsql/index.js +3 -0
  143. package/dist/libsql/index.js.map +1 -0
  144. package/dist/libsql/libsqlQuerier.d.ts +17 -0
  145. package/dist/libsql/libsqlQuerier.d.ts.map +1 -0
  146. package/dist/libsql/libsqlQuerier.js +71 -0
  147. package/dist/libsql/libsqlQuerier.js.map +1 -0
  148. package/dist/libsql/libsqlQuerierPool.d.ts +12 -0
  149. package/dist/libsql/libsqlQuerierPool.d.ts.map +1 -0
  150. package/dist/libsql/libsqlQuerierPool.js +19 -0
  151. package/dist/libsql/libsqlQuerierPool.js.map +1 -0
  152. package/dist/maria/index.d.ts +4 -0
  153. package/dist/maria/index.d.ts.map +1 -0
  154. package/dist/maria/index.js +4 -0
  155. package/dist/maria/index.js.map +1 -0
  156. package/dist/maria/mariaDialect.d.ts +10 -0
  157. package/dist/maria/mariaDialect.d.ts.map +1 -0
  158. package/dist/maria/mariaDialect.js +41 -0
  159. package/dist/maria/mariaDialect.js.map +1 -0
  160. package/dist/maria/mariadbQuerier.d.ts +10 -0
  161. package/dist/maria/mariadbQuerier.d.ts.map +1 -0
  162. package/dist/maria/mariadbQuerier.js +20 -0
  163. package/dist/maria/mariadbQuerier.js.map +1 -0
  164. package/dist/maria/mariadbQuerierPool.d.ts +11 -0
  165. package/dist/maria/mariadbQuerierPool.d.ts.map +1 -0
  166. package/dist/maria/mariadbQuerierPool.js +17 -0
  167. package/dist/maria/mariadbQuerierPool.js.map +1 -0
  168. package/dist/migrate/bin.d.ts +3 -0
  169. package/dist/migrate/bin.d.ts.map +1 -0
  170. package/dist/migrate/bin.js +7 -0
  171. package/dist/migrate/bin.js.map +1 -0
  172. package/dist/migrate/builder/columnBuilder.d.ts +79 -0
  173. package/dist/migrate/builder/columnBuilder.d.ts.map +1 -0
  174. package/dist/migrate/builder/columnBuilder.js +159 -0
  175. package/dist/migrate/builder/columnBuilder.js.map +1 -0
  176. package/dist/migrate/builder/expressions.d.ts +87 -0
  177. package/dist/migrate/builder/expressions.d.ts.map +1 -0
  178. package/dist/migrate/builder/expressions.js +150 -0
  179. package/dist/migrate/builder/expressions.js.map +1 -0
  180. package/dist/migrate/builder/index.d.ts +6 -0
  181. package/dist/migrate/builder/index.d.ts.map +1 -0
  182. package/dist/migrate/builder/index.js +6 -0
  183. package/dist/migrate/builder/index.js.map +1 -0
  184. package/dist/migrate/builder/migrationBuilder.d.ts +109 -0
  185. package/dist/migrate/builder/migrationBuilder.d.ts.map +1 -0
  186. package/dist/migrate/builder/migrationBuilder.js +463 -0
  187. package/dist/migrate/builder/migrationBuilder.js.map +1 -0
  188. package/dist/migrate/builder/tableBuilder.d.ts +51 -0
  189. package/dist/migrate/builder/tableBuilder.d.ts.map +1 -0
  190. package/dist/migrate/builder/tableBuilder.js +291 -0
  191. package/dist/migrate/builder/tableBuilder.js.map +1 -0
  192. package/dist/migrate/builder/types.d.ts +466 -0
  193. package/dist/migrate/builder/types.d.ts.map +1 -0
  194. package/dist/migrate/builder/types.js +8 -0
  195. package/dist/migrate/builder/types.js.map +1 -0
  196. package/dist/migrate/cli-config.d.ts +3 -0
  197. package/dist/migrate/cli-config.d.ts.map +1 -0
  198. package/dist/migrate/cli-config.js +35 -0
  199. package/dist/migrate/cli-config.js.map +1 -0
  200. package/dist/migrate/cli.d.ts +16 -0
  201. package/dist/migrate/cli.d.ts.map +1 -0
  202. package/dist/migrate/cli.js +394 -0
  203. package/dist/migrate/cli.js.map +1 -0
  204. package/dist/migrate/codegen/entityCodeGenerator.d.ts +137 -0
  205. package/dist/migrate/codegen/entityCodeGenerator.d.ts.map +1 -0
  206. package/dist/migrate/codegen/entityCodeGenerator.js +405 -0
  207. package/dist/migrate/codegen/entityCodeGenerator.js.map +1 -0
  208. package/dist/migrate/codegen/entityMerger.d.ts +115 -0
  209. package/dist/migrate/codegen/entityMerger.d.ts.map +1 -0
  210. package/dist/migrate/codegen/entityMerger.js +294 -0
  211. package/dist/migrate/codegen/entityMerger.js.map +1 -0
  212. package/dist/migrate/codegen/index.d.ts +10 -0
  213. package/dist/migrate/codegen/index.d.ts.map +1 -0
  214. package/dist/migrate/codegen/index.js +14 -0
  215. package/dist/migrate/codegen/index.js.map +1 -0
  216. package/dist/migrate/codegen/migrationCodeGenerator.d.ts +62 -0
  217. package/dist/migrate/codegen/migrationCodeGenerator.d.ts.map +1 -0
  218. package/dist/migrate/codegen/migrationCodeGenerator.js +356 -0
  219. package/dist/migrate/codegen/migrationCodeGenerator.js.map +1 -0
  220. package/dist/migrate/codegen/smartRelationDetector.d.ts +48 -0
  221. package/dist/migrate/codegen/smartRelationDetector.d.ts.map +1 -0
  222. package/dist/migrate/codegen/smartRelationDetector.js +135 -0
  223. package/dist/migrate/codegen/smartRelationDetector.js.map +1 -0
  224. package/dist/migrate/drift/driftDetector.d.ts +81 -0
  225. package/dist/migrate/drift/driftDetector.d.ts.map +1 -0
  226. package/dist/migrate/drift/driftDetector.js +248 -0
  227. package/dist/migrate/drift/driftDetector.js.map +1 -0
  228. package/dist/migrate/drift/index.d.ts +7 -0
  229. package/dist/migrate/drift/index.d.ts.map +1 -0
  230. package/dist/migrate/drift/index.js +7 -0
  231. package/dist/migrate/drift/index.js.map +1 -0
  232. package/dist/migrate/generator/index.d.ts +3 -0
  233. package/dist/migrate/generator/index.d.ts.map +1 -0
  234. package/dist/migrate/generator/index.js +3 -0
  235. package/dist/migrate/generator/index.js.map +1 -0
  236. package/dist/migrate/generator/mongoSchemaGenerator.d.ts +39 -0
  237. package/dist/migrate/generator/mongoSchemaGenerator.d.ts.map +1 -0
  238. package/dist/migrate/generator/mongoSchemaGenerator.js +183 -0
  239. package/dist/migrate/generator/mongoSchemaGenerator.js.map +1 -0
  240. package/dist/migrate/index.d.ts +13 -0
  241. package/dist/migrate/index.d.ts.map +1 -0
  242. package/dist/migrate/index.js +20 -0
  243. package/dist/migrate/index.js.map +1 -0
  244. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts +77 -0
  245. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.d.ts.map +1 -0
  246. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js +156 -0
  247. package/dist/migrate/introspection/abstractSqlSchemaIntrospector.js.map +1 -0
  248. package/dist/migrate/introspection/baseSqlIntrospector.d.ts +28 -0
  249. package/dist/migrate/introspection/baseSqlIntrospector.d.ts.map +1 -0
  250. package/dist/migrate/introspection/baseSqlIntrospector.js +135 -0
  251. package/dist/migrate/introspection/baseSqlIntrospector.js.map +1 -0
  252. package/dist/migrate/introspection/index.d.ts +6 -0
  253. package/dist/migrate/introspection/index.d.ts.map +1 -0
  254. package/dist/migrate/introspection/index.js +6 -0
  255. package/dist/migrate/introspection/index.js.map +1 -0
  256. package/dist/migrate/introspection/mongoIntrospector.d.ts +15 -0
  257. package/dist/migrate/introspection/mongoIntrospector.d.ts.map +1 -0
  258. package/dist/migrate/introspection/mongoIntrospector.js +100 -0
  259. package/dist/migrate/introspection/mongoIntrospector.js.map +1 -0
  260. package/dist/migrate/introspection/mysqlIntrospector.d.ts +59 -0
  261. package/dist/migrate/introspection/mysqlIntrospector.d.ts.map +1 -0
  262. package/dist/migrate/introspection/mysqlIntrospector.js +175 -0
  263. package/dist/migrate/introspection/mysqlIntrospector.js.map +1 -0
  264. package/dist/migrate/introspection/postgresIntrospector.d.ts +55 -0
  265. package/dist/migrate/introspection/postgresIntrospector.d.ts.map +1 -0
  266. package/dist/migrate/introspection/postgresIntrospector.js +226 -0
  267. package/dist/migrate/introspection/postgresIntrospector.js.map +1 -0
  268. package/dist/migrate/introspection/sqliteIntrospector.d.ts +60 -0
  269. package/dist/migrate/introspection/sqliteIntrospector.d.ts.map +1 -0
  270. package/dist/migrate/introspection/sqliteIntrospector.js +180 -0
  271. package/dist/migrate/introspection/sqliteIntrospector.js.map +1 -0
  272. package/dist/migrate/migrator.d.ts +176 -0
  273. package/dist/migrate/migrator.d.ts.map +1 -0
  274. package/dist/migrate/migrator.js +624 -0
  275. package/dist/migrate/migrator.js.map +1 -0
  276. package/dist/migrate/schemaGenerator.d.ts +132 -0
  277. package/dist/migrate/schemaGenerator.d.ts.map +1 -0
  278. package/dist/migrate/schemaGenerator.js +628 -0
  279. package/dist/migrate/schemaGenerator.js.map +1 -0
  280. package/dist/migrate/storage/databaseStorage.d.ts +25 -0
  281. package/dist/migrate/storage/databaseStorage.d.ts.map +1 -0
  282. package/dist/migrate/storage/databaseStorage.js +77 -0
  283. package/dist/migrate/storage/databaseStorage.js.map +1 -0
  284. package/dist/migrate/storage/index.d.ts +3 -0
  285. package/dist/migrate/storage/index.d.ts.map +1 -0
  286. package/dist/migrate/storage/index.js +3 -0
  287. package/dist/migrate/storage/index.js.map +1 -0
  288. package/dist/migrate/storage/jsonStorage.d.ts +16 -0
  289. package/dist/migrate/storage/jsonStorage.d.ts.map +1 -0
  290. package/dist/migrate/storage/jsonStorage.js +43 -0
  291. package/dist/migrate/storage/jsonStorage.js.map +1 -0
  292. package/dist/migrate/sync/index.d.ts +7 -0
  293. package/dist/migrate/sync/index.d.ts.map +1 -0
  294. package/dist/migrate/sync/index.js +7 -0
  295. package/dist/migrate/sync/index.js.map +1 -0
  296. package/dist/migrate/sync/schemaSync.d.ts +132 -0
  297. package/dist/migrate/sync/schemaSync.d.ts.map +1 -0
  298. package/dist/migrate/sync/schemaSync.js +260 -0
  299. package/dist/migrate/sync/schemaSync.js.map +1 -0
  300. package/dist/mongo/index.d.ts +4 -0
  301. package/dist/mongo/index.d.ts.map +1 -0
  302. package/dist/mongo/index.js +4 -0
  303. package/dist/mongo/index.js.map +1 -0
  304. package/dist/mongo/mongoDialect.d.ts +47 -0
  305. package/dist/mongo/mongoDialect.d.ts.map +1 -0
  306. package/dist/mongo/mongoDialect.js +299 -0
  307. package/dist/mongo/mongoDialect.js.map +1 -0
  308. package/dist/mongo/mongodbQuerier.d.ts +32 -0
  309. package/dist/mongo/mongodbQuerier.d.ts.map +1 -0
  310. package/dist/mongo/mongodbQuerier.js +267 -0
  311. package/dist/mongo/mongodbQuerier.js.map +1 -0
  312. package/dist/mongo/mongodbQuerierPool.d.ts +11 -0
  313. package/dist/mongo/mongodbQuerierPool.d.ts.map +1 -0
  314. package/dist/mongo/mongodbQuerierPool.js +20 -0
  315. package/dist/mongo/mongodbQuerierPool.js.map +1 -0
  316. package/dist/mysql/index.d.ts +4 -0
  317. package/dist/mysql/index.d.ts.map +1 -0
  318. package/dist/mysql/index.js +4 -0
  319. package/dist/mysql/index.js.map +1 -0
  320. package/dist/mysql/mysql2Querier.d.ts +14 -0
  321. package/dist/mysql/mysql2Querier.d.ts.map +1 -0
  322. package/dist/mysql/mysql2Querier.js +25 -0
  323. package/dist/mysql/mysql2Querier.js.map +1 -0
  324. package/dist/mysql/mysql2QuerierPool.d.ts +11 -0
  325. package/dist/mysql/mysql2QuerierPool.d.ts.map +1 -0
  326. package/dist/mysql/mysql2QuerierPool.js +17 -0
  327. package/dist/mysql/mysql2QuerierPool.js.map +1 -0
  328. package/dist/mysql/mysqlDialect.d.ts +19 -0
  329. package/dist/mysql/mysqlDialect.d.ts.map +1 -0
  330. package/dist/mysql/mysqlDialect.js +97 -0
  331. package/dist/mysql/mysqlDialect.js.map +1 -0
  332. package/dist/namingStrategy/defaultNamingStrategy.d.ts +10 -0
  333. package/dist/namingStrategy/defaultNamingStrategy.d.ts.map +1 -0
  334. package/dist/namingStrategy/defaultNamingStrategy.js +15 -0
  335. package/dist/namingStrategy/defaultNamingStrategy.js.map +1 -0
  336. package/dist/namingStrategy/index.d.ts +3 -0
  337. package/dist/namingStrategy/index.d.ts.map +1 -0
  338. package/dist/namingStrategy/index.js +3 -0
  339. package/dist/namingStrategy/index.js.map +1 -0
  340. package/dist/namingStrategy/snakeCaseNamingStrategy.d.ts +9 -0
  341. package/dist/namingStrategy/snakeCaseNamingStrategy.d.ts.map +1 -0
  342. package/dist/namingStrategy/snakeCaseNamingStrategy.js +14 -0
  343. package/dist/namingStrategy/snakeCaseNamingStrategy.js.map +1 -0
  344. package/dist/neon/index.d.ts +3 -0
  345. package/dist/neon/index.d.ts.map +1 -0
  346. package/dist/neon/index.js +3 -0
  347. package/dist/neon/index.js.map +1 -0
  348. package/dist/neon/neonQuerier.d.ts +10 -0
  349. package/dist/neon/neonQuerier.d.ts.map +1 -0
  350. package/dist/neon/neonQuerier.js +20 -0
  351. package/dist/neon/neonQuerier.js.map +1 -0
  352. package/dist/neon/neonQuerierPool.d.ts +11 -0
  353. package/dist/neon/neonQuerierPool.d.ts.map +1 -0
  354. package/dist/neon/neonQuerierPool.js +17 -0
  355. package/dist/neon/neonQuerierPool.js.map +1 -0
  356. package/dist/options.d.ts +5 -0
  357. package/dist/options.d.ts.map +1 -0
  358. package/dist/options.js +14 -0
  359. package/dist/options.js.map +1 -0
  360. package/dist/postgres/index.d.ts +4 -0
  361. package/dist/postgres/index.d.ts.map +1 -0
  362. package/dist/postgres/index.js +4 -0
  363. package/dist/postgres/index.js.map +1 -0
  364. package/dist/postgres/pgQuerier.d.ts +10 -0
  365. package/dist/postgres/pgQuerier.d.ts.map +1 -0
  366. package/dist/postgres/pgQuerier.js +20 -0
  367. package/dist/postgres/pgQuerier.js.map +1 -0
  368. package/dist/postgres/pgQuerierPool.d.ts +11 -0
  369. package/dist/postgres/pgQuerierPool.d.ts.map +1 -0
  370. package/dist/postgres/pgQuerierPool.js +17 -0
  371. package/dist/postgres/pgQuerierPool.js.map +1 -0
  372. package/dist/postgres/postgresDialect.d.ts +36 -0
  373. package/dist/postgres/postgresDialect.d.ts.map +1 -0
  374. package/dist/postgres/postgresDialect.js +201 -0
  375. package/dist/postgres/postgresDialect.js.map +1 -0
  376. package/dist/querier/abstractPoolQuerier.d.ts +13 -0
  377. package/dist/querier/abstractPoolQuerier.d.ts.map +1 -0
  378. package/dist/querier/abstractPoolQuerier.js +25 -0
  379. package/dist/querier/abstractPoolQuerier.js.map +1 -0
  380. package/dist/querier/abstractQuerier.d.ts +109 -0
  381. package/dist/querier/abstractQuerier.d.ts.map +1 -0
  382. package/dist/querier/abstractQuerier.js +378 -0
  383. package/dist/querier/abstractQuerier.js.map +1 -0
  384. package/dist/querier/abstractQuerierPool.d.ts +23 -0
  385. package/dist/querier/abstractQuerierPool.d.ts.map +1 -0
  386. package/dist/querier/abstractQuerierPool.js +28 -0
  387. package/dist/querier/abstractQuerierPool.js.map +1 -0
  388. package/dist/querier/abstractSqlQuerier.d.ts +38 -0
  389. package/dist/querier/abstractSqlQuerier.d.ts.map +1 -0
  390. package/dist/querier/abstractSqlQuerier.js +169 -0
  391. package/dist/querier/abstractSqlQuerier.js.map +1 -0
  392. package/dist/querier/decorator/index.d.ts +5 -0
  393. package/dist/querier/decorator/index.d.ts.map +1 -0
  394. package/dist/querier/decorator/index.js +5 -0
  395. package/dist/querier/decorator/index.js.map +1 -0
  396. package/dist/querier/decorator/injectQuerier.d.ts +4 -0
  397. package/dist/querier/decorator/injectQuerier.d.ts.map +1 -0
  398. package/dist/querier/decorator/injectQuerier.js +33 -0
  399. package/dist/querier/decorator/injectQuerier.js.map +1 -0
  400. package/dist/querier/decorator/log.d.ts +7 -0
  401. package/dist/querier/decorator/log.d.ts.map +1 -0
  402. package/dist/querier/decorator/log.js +27 -0
  403. package/dist/querier/decorator/log.js.map +1 -0
  404. package/dist/querier/decorator/serialized.d.ts +7 -0
  405. package/dist/querier/decorator/serialized.d.ts.map +1 -0
  406. package/dist/querier/decorator/serialized.js +14 -0
  407. package/dist/querier/decorator/serialized.js.map +1 -0
  408. package/dist/querier/decorator/transactional.d.ts +6 -0
  409. package/dist/querier/decorator/transactional.d.ts.map +1 -0
  410. package/dist/querier/decorator/transactional.js +48 -0
  411. package/dist/querier/decorator/transactional.js.map +1 -0
  412. package/dist/querier/index.d.ts +5 -0
  413. package/dist/querier/index.d.ts.map +1 -0
  414. package/dist/querier/index.js +5 -0
  415. package/dist/querier/index.js.map +1 -0
  416. package/dist/schema/canonicalType.d.ts +42 -0
  417. package/dist/schema/canonicalType.d.ts.map +1 -0
  418. package/dist/schema/canonicalType.js +524 -0
  419. package/dist/schema/canonicalType.js.map +1 -0
  420. package/dist/schema/index.d.ts +28 -0
  421. package/dist/schema/index.d.ts.map +1 -0
  422. package/dist/schema/index.js +29 -0
  423. package/dist/schema/index.js.map +1 -0
  424. package/dist/schema/schemaAST.d.ts +155 -0
  425. package/dist/schema/schemaAST.d.ts.map +1 -0
  426. package/dist/schema/schemaAST.js +496 -0
  427. package/dist/schema/schemaAST.js.map +1 -0
  428. package/dist/schema/schemaASTBuilder.d.ts +58 -0
  429. package/dist/schema/schemaASTBuilder.d.ts.map +1 -0
  430. package/dist/schema/schemaASTBuilder.js +224 -0
  431. package/dist/schema/schemaASTBuilder.js.map +1 -0
  432. package/dist/schema/schemaASTDiffer.d.ts +84 -0
  433. package/dist/schema/schemaASTDiffer.d.ts.map +1 -0
  434. package/dist/schema/schemaASTDiffer.js +431 -0
  435. package/dist/schema/schemaASTDiffer.js.map +1 -0
  436. package/dist/schema/types.d.ts +347 -0
  437. package/dist/schema/types.d.ts.map +1 -0
  438. package/dist/schema/types.js +11 -0
  439. package/dist/schema/types.js.map +1 -0
  440. package/dist/sqlite/abstractSqliteQuerier.d.ts +6 -0
  441. package/dist/sqlite/abstractSqliteQuerier.d.ts.map +1 -0
  442. package/dist/sqlite/abstractSqliteQuerier.js +13 -0
  443. package/dist/sqlite/abstractSqliteQuerier.js.map +1 -0
  444. package/dist/sqlite/index.d.ts +4 -0
  445. package/dist/sqlite/index.d.ts.map +1 -0
  446. package/dist/sqlite/index.js +4 -0
  447. package/dist/sqlite/index.js.map +1 -0
  448. package/dist/sqlite/sqliteDialect.d.ts +42 -0
  449. package/dist/sqlite/sqliteDialect.d.ts.map +1 -0
  450. package/dist/sqlite/sqliteDialect.js +129 -0
  451. package/dist/sqlite/sqliteDialect.js.map +1 -0
  452. package/dist/sqlite/sqliteQuerier.d.ts +12 -0
  453. package/dist/sqlite/sqliteQuerier.d.ts.map +1 -0
  454. package/dist/sqlite/sqliteQuerier.js +25 -0
  455. package/dist/sqlite/sqliteQuerier.js.map +1 -0
  456. package/dist/sqlite/sqliteQuerierPool.d.ts +13 -0
  457. package/dist/sqlite/sqliteQuerierPool.d.ts.map +1 -0
  458. package/dist/sqlite/sqliteQuerierPool.js +34 -0
  459. package/dist/sqlite/sqliteQuerierPool.js.map +1 -0
  460. package/dist/type/config.d.ts +46 -0
  461. package/dist/type/config.d.ts.map +1 -0
  462. package/dist/type/config.js +2 -0
  463. package/dist/type/config.js.map +1 -0
  464. package/dist/type/entity.d.ts +289 -0
  465. package/dist/type/entity.d.ts.map +1 -0
  466. package/dist/type/entity.js +5 -0
  467. package/dist/type/entity.js.map +1 -0
  468. package/dist/type/index.d.ts +11 -0
  469. package/dist/type/index.d.ts.map +1 -0
  470. package/dist/type/index.js +11 -0
  471. package/dist/type/index.js.map +1 -0
  472. package/dist/type/logger.d.ts +61 -0
  473. package/dist/type/logger.d.ts.map +1 -0
  474. package/dist/type/logger.js +2 -0
  475. package/dist/type/logger.js.map +1 -0
  476. package/dist/type/migration.d.ts +268 -0
  477. package/dist/type/migration.d.ts.map +1 -0
  478. package/dist/type/migration.js +2 -0
  479. package/dist/type/migration.js.map +1 -0
  480. package/dist/type/namingStrategy.d.ts +18 -0
  481. package/dist/type/namingStrategy.d.ts.map +1 -0
  482. package/dist/type/namingStrategy.js +2 -0
  483. package/dist/type/namingStrategy.js.map +1 -0
  484. package/dist/type/querier.d.ts +154 -0
  485. package/dist/type/querier.d.ts.map +1 -0
  486. package/dist/type/querier.js +11 -0
  487. package/dist/type/querier.js.map +1 -0
  488. package/dist/type/querierPool.d.ts +31 -0
  489. package/dist/type/querierPool.d.ts.map +1 -0
  490. package/dist/type/querierPool.js +2 -0
  491. package/dist/type/querierPool.js.map +1 -0
  492. package/dist/type/query.d.ts +475 -0
  493. package/dist/type/query.d.ts.map +1 -0
  494. package/dist/type/query.js +11 -0
  495. package/dist/type/query.js.map +1 -0
  496. package/dist/type/universalQuerier.d.ts +120 -0
  497. package/dist/type/universalQuerier.d.ts.map +1 -0
  498. package/dist/type/universalQuerier.js +2 -0
  499. package/dist/type/universalQuerier.js.map +1 -0
  500. package/dist/type/utility.d.ts +33 -0
  501. package/dist/type/utility.d.ts.map +1 -0
  502. package/dist/type/utility.js +2 -0
  503. package/dist/type/utility.js.map +1 -0
  504. package/dist/util/dialect.util.d.ts +13 -0
  505. package/dist/util/dialect.util.d.ts.map +1 -0
  506. package/dist/util/dialect.util.js +82 -0
  507. package/dist/util/dialect.util.js.map +1 -0
  508. package/dist/util/field.util.d.ts +14 -0
  509. package/dist/util/field.util.d.ts.map +1 -0
  510. package/dist/util/field.util.js +57 -0
  511. package/dist/util/field.util.js.map +1 -0
  512. package/dist/util/hook.util.d.ts +15 -0
  513. package/dist/util/hook.util.d.ts.map +1 -0
  514. package/dist/util/hook.util.js +20 -0
  515. package/dist/util/hook.util.js.map +1 -0
  516. package/dist/util/index.d.ts +9 -0
  517. package/dist/util/index.d.ts.map +1 -0
  518. package/dist/util/index.js +9 -0
  519. package/dist/util/index.js.map +1 -0
  520. package/dist/util/logger.d.ts +34 -0
  521. package/dist/util/logger.d.ts.map +1 -0
  522. package/dist/util/logger.js +129 -0
  523. package/dist/util/logger.js.map +1 -0
  524. package/dist/util/object.util.d.ts +8 -0
  525. package/dist/util/object.util.d.ts.map +1 -0
  526. package/dist/util/object.util.js +19 -0
  527. package/dist/util/object.util.js.map +1 -0
  528. package/dist/util/raw.d.ts +9 -0
  529. package/dist/util/raw.d.ts.map +1 -0
  530. package/dist/util/raw.js +11 -0
  531. package/dist/util/raw.js.map +1 -0
  532. package/dist/util/sql.util.d.ts +22 -0
  533. package/dist/util/sql.util.d.ts.map +1 -0
  534. package/dist/util/sql.util.js +88 -0
  535. package/dist/util/sql.util.js.map +1 -0
  536. package/dist/util/string.util.d.ts +29 -0
  537. package/dist/util/string.util.d.ts.map +1 -0
  538. package/dist/util/string.util.js +91 -0
  539. package/dist/util/string.util.js.map +1 -0
  540. package/package.json +146 -0
package/README.md ADDED
@@ -0,0 +1,560 @@
1
+ <!-- ![code](/assets/code.webp 'code') -->
2
+
3
+ [![uql maku](assets/logo.svg)](https://uql-orm.dev)
4
+
5
+ [![tests](https://github.com/rogerpadilla/uql/actions/workflows/tests.yml/badge.svg)](https://github.com/rogerpadilla/uql) [![Coverage Status](https://coveralls.io/repos/github/rogerpadilla/uql/badge.svg?branch=main)](https://coveralls.io/github/rogerpadilla/uql?branch=main) [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/rogerpadilla/uql/blob/main/LICENSE) [![npm version](https://img.shields.io/npm/v/uql-orm.svg)](https://www.npmjs.com/package/uql-orm)
6
+
7
+ **[UQL](https://uql-orm.dev)** is the [smartest ORM](https://medium.com/@rogerpadillac/in-search-of-the-perfect-orm-e01fcc9bce3d) for TypeScript. It is engineered to be **fast**, **safe**, and **universally compatible**.
8
+
9
+
10
+ ```ts
11
+ const users = await querier.findMany(User, {
12
+ $select: { email: true, profile: { $select: { picture: true } } },
13
+ $where: { email: { $endsWith: '@domain.com' } },
14
+ $sort: { createdAt: 'desc' },
15
+ $limit: 100,
16
+ });
17
+ ```
18
+
19
+ &nbsp;
20
+
21
+ ## Features
22
+
23
+ | Feature | Description |
24
+ | :----------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |
25
+ | **[Context-Aware Queries](https://uql-orm.dev/querying/relations)** | Deep type-safety for operators and [relations](https://uql-orm.dev/querying/relations) at any depth. |
26
+ | **Serializable JSON** | 100% valid JSON queries for easy transport over HTTP/Websockets. |
27
+ | **Unified Dialects** | Write once, run anywhere: PostgreSQL, MySQL, SQLite, MongoDB, and more. |
28
+ | **[Naming Strategies](https://uql-orm.dev/naming-strategy)** | Pluggable system to translate between TypeScript `camelCase` and database `snake_case`. |
29
+ | **Smart SQL Engine** | Optimized sub-queries, placeholders ($1, $2), and minimal SQL generation via `QueryContext`. |
30
+ | **Thread-Safe by Design** | Centralized task queue and `@Serialized()` decorator prevent race conditions. |
31
+ | **[Declarative Transactions](https://uql-orm.dev/transactions)** | Standard `@Transactional()` and `@InjectQuerier()` decorators for NestJS/DI. |
32
+ | **[Lifecycle Hooks](https://uql-orm.dev/entities/lifecycle-hooks)**| `@BeforeInsert`, `@AfterLoad` and 5 more decorators for validation, timestamps, and computed fields. |
33
+ | **[Modern &amp; Versatile](https://uql-orm.dev/entities/virtual-fields)** | **Pure ESM**, high-res timing, [Soft-delete](https://uql-orm.dev/entities/soft-delete), and **Vector/JSONB/JSON** support. |
34
+ | **[Database Migrations](https://www.uql-orm.dev/migrations)** | Built-in [Entity-First synchronization](https://uql-orm.dev/migrations#3-entity-first-synchronization-development) and a robust CLI for version-controlled schema evolution. |
35
+ | **[Logging & Monitoring](https://www.uql-orm.dev/logging)** | Professional-grade monitoring with slow-query detection and colored output. |
36
+
37
+ &nbsp;
38
+
39
+ ## 1. Install
40
+
41
+ Install the core package and the driver for your database:
42
+
43
+ ```sh
44
+ # Core
45
+ npm install uql-orm # or bun add / pnpm add
46
+ ```
47
+
48
+ ### Supported Drivers (pick according to your database)
49
+
50
+ | Database | Command |
51
+ | :----------------------------------------------------- | :----------------------------- |
52
+ | **PostgreSQL** (incl. Neon, Cockroach, Yugabyte) | `npm install pg` |
53
+ | **MySQL** (incl. TiDB, Aurora) | `npm install mysql2` |
54
+ | **MariaDB** | `npm install mariadb` |
55
+ | **SQLite** | `npm install better-sqlite3` |
56
+ | **LibSQL** (incl. Turso) | `npm install @libsql/client` |
57
+ | **MongoDB** | `npm install mongodb` |
58
+ | **Cloudflare D1** | _Native (no driver needed)_ |
59
+
60
+ ### TypeScript Configuration
61
+
62
+ Ensure your `tsconfig.json` is configured to support decorators and metadata:
63
+
64
+ ```json
65
+ {
66
+ "compilerOptions": {
67
+ "experimentalDecorators": true,
68
+ "emitDecoratorMetadata": true,
69
+ "module": "NodeNext",
70
+ "target": "ESNext"
71
+ }
72
+ }
73
+ ```
74
+
75
+ &nbsp;**Note:** `ES2020+` will work for `target` as well.
76
+
77
+ ## 2. Define the Entities
78
+
79
+ Annotate your classes with decorators. UQL's engine uses this metadata for both type-safe querying and precise DDL generation.
80
+
81
+ ### Core Decorators
82
+
83
+ | Decorator | Purpose |
84
+ | :-------------- | :----------------------------------------------------------------------------- |
85
+ | `@Entity()` | Marks a class as a database table/collection. |
86
+ | `@Id()` | Defines the Primary Key with support for `onInsert` generators (UUIDs, etc). |
87
+ | `@Field()` | Standard column. Use `{ reference: ... }` for Foreign Keys. |
88
+ | `@Index()` | Defines a composite or custom index on one or more columns. |
89
+ | `@OneToOne` | Defines a one-to-one relationship. |
90
+ | `@OneToMany` | Defines a one-to-many relationship. |
91
+ | `@ManyToOne` | Defines a many-to-one relationship. |
92
+ | `@ManyToMany` | Defines a many-to-many relationship. |
93
+ | `@Virtual()` | Defines a read-only field calculated via SQL (see Advanced). |
94
+ | `@BeforeInsert` / `@AfterInsert` | Lifecycle hooks fired around `insert` operations. |
95
+ | `@BeforeUpdate` / `@AfterUpdate` | Lifecycle hooks fired around `update` operations. |
96
+ | `@BeforeDelete` / `@AfterDelete` | Lifecycle hooks fired around `delete` operations. |
97
+ | `@AfterLoad` | Lifecycle hook fired after loading entities from the database. |
98
+
99
+ ### Type Abstraction: Logical vs. Physical
100
+
101
+ UQL separates the **intent** of your data from its **storage**. Both properties are **optional**; if omitted, UQL performs a *best-effort inference* using the TypeScript types from your class (provided `emitDecoratorMetadata` is enabled).
102
+
103
+ | Property | Purpose | Values |
104
+ | :--- | :--- | :--- |
105
+ | **`type`** | **Logical Type** (Abstraction). Used for runtime behavior and automatic SQL mapping. | `String`, `Number`, `Boolean`, `Date`, `BigInt`, or semantic strings: `'uuid'`, `'json'`, `'vector'`. |
106
+ | **`columnType`** | **Physical Type** (Implementation). **Highest Priority**. Bypasses UQL's inference for exact SQL control. | Raw SQL types: `'varchar(100)'`, `'decimal(10,2)'`, `'smallint'`, etc. |
107
+
108
+ ```ts
109
+ // Automatic inference from TypeScript types
110
+ @Field() name?: string; // → TEXT (Postgres), VARCHAR(255) (MySQL)
111
+ @Field() age?: number; // → INTEGER
112
+ @Field() isActive?: boolean; // → BOOLEAN
113
+ @Field() createdAt?: Date; // → TIMESTAMP
114
+
115
+ // Semantic types - portable across all databases
116
+ @Field({ type: 'uuid' }) // → UUID (Postgres), CHAR(36) (MySQL), TEXT (SQLite)
117
+ externalId?: string;
118
+
119
+ @Field({ type: 'json' }) // → JSONB (Postgres), JSON (MySQL), TEXT (SQLite)
120
+ metadata?: Json<{ theme?: string }>;
121
+
122
+ // Logical types with constraints - portable with control
123
+ @Field({ type: 'varchar', length: 500 })
124
+ bio?: string;
125
+
126
+ @Field({ type: 'decimal', precision: 10, scale: 2 })
127
+ price?: number;
128
+
129
+ // Exact SQL type - when you need dialect-specific control
130
+ @Field({ columnType: 'smallint' })
131
+ statusCode?: number;
132
+ ```
133
+
134
+
135
+ &nbsp;
136
+
137
+ ```ts
138
+ import { v7 as uuidv7 } from 'uuid';
139
+ import { Entity, Id, Field, OneToOne, OneToMany, ManyToOne, ManyToMany, type Relation, type Json } from 'uql-orm';
140
+
141
+ @Entity()
142
+ export class User {
143
+ @Id({ type: 'uuid', onInsert: () => uuidv7() })
144
+ id?: string;
145
+
146
+ @Field({
147
+ index: true,
148
+ })
149
+ name?: string;
150
+
151
+ @Field({
152
+ unique: true,
153
+ comment: 'User login email',
154
+ })
155
+ email?: string;
156
+
157
+ @OneToOne({
158
+ entity: () => Profile,
159
+ mappedBy: (profile) => profile.user,
160
+ cascade: true,
161
+ })
162
+ profile?: Relation<Profile>;
163
+
164
+ @OneToMany({
165
+ entity: () => Post,
166
+ mappedBy: (post) => post.author,
167
+ })
168
+ posts?: Relation<Post>[];
169
+ }
170
+
171
+ @Entity()
172
+ export class Profile {
173
+ @Id({ type: 'uuid', onInsert: () => uuidv7() })
174
+ id?: string;
175
+
176
+ @Field()
177
+ bio?: string;
178
+
179
+ @Field({ reference: () => User, foreignKey: 'fk_profile_user' })
180
+ userId?: string;
181
+
182
+ @OneToOne({ entity: () => User })
183
+ user?: User;
184
+ }
185
+
186
+ @Entity()
187
+ export class Post {
188
+ @Id()
189
+ id?: number;
190
+
191
+ @Field()
192
+ title?: string;
193
+
194
+ @Field({ reference: () => User })
195
+ authorId?: string;
196
+
197
+ @ManyToOne({ entity: () => User })
198
+ author?: User;
199
+
200
+ @ManyToMany({
201
+ entity: () => Tag,
202
+ through: () => PostTag,
203
+ })
204
+ tags?: Tag[];
205
+ }
206
+
207
+ @Entity()
208
+ export class Tag {
209
+ @Id({ type: 'uuid', onInsert: () => uuidv7() })
210
+ id?: string;
211
+
212
+ @Field()
213
+ name?: string;
214
+ }
215
+
216
+ @Entity()
217
+ export class PostTag {
218
+ @Id({ type: 'uuid', onInsert: () => uuidv7() })
219
+ id?: string;
220
+
221
+ @Field({ reference: () => Post })
222
+ postId?: number;
223
+
224
+ @Field({ reference: () => Tag })
225
+ tagId?: string;
226
+ }
227
+ ```
228
+
229
+ > **Pro Tip**: Use the `Relation<T>` utility type for relationship properties. It prevents TypeScript circular dependency errors while maintaining full type-safety.
230
+
231
+ &nbsp;
232
+
233
+ ## 3. Set up a pool
234
+
235
+ A pool manages connections (queriers). Initialize it once at application bootstrap (e.g., in `server.ts`).
236
+
237
+ ```ts
238
+ import { SnakeCaseNamingStrategy, type Config } from 'uql-orm';
239
+ import { PgQuerierPool } from 'uql-orm/postgres'; // or mysql2, sqlite, etc.
240
+ import { User, Profile, Post } from './entities';
241
+
242
+ export const pool = new PgQuerierPool(
243
+ { host: 'localhost', database: 'uql_app', max: 10 },
244
+ {
245
+ logger: ['error', 'warn', 'migration'],
246
+ namingStrategy: new SnakeCaseNamingStrategy()
247
+ slowQuery: { threshold: 1000 },
248
+ }
249
+ );
250
+
251
+ export default {
252
+ pool,
253
+ entities: [User, Profile, Post],
254
+ migrationsPath: './migrations',
255
+ } satisfies Config;
256
+ ```
257
+
258
+ > **Pro Tip**: Reusing the same connection pool for both your application and migrations is recommended. It reduces connection overhead and ensures consistent query settings (like naming strategies).
259
+
260
+ &nbsp;
261
+
262
+ &nbsp;
263
+
264
+ ## 4. Manipulate the Data
265
+
266
+ UQL provides a straightforward API to interact with your data. **Always ensure queriers are released back to the pool.**
267
+
268
+ ```ts
269
+ const querier = await pool.getQuerier();
270
+ try {
271
+ const users = await querier.findMany(User, {
272
+ $select: {
273
+ name: true,
274
+ profile: { $select: { bio: true }, $required: true } // INNER JOIN
275
+ },
276
+ $where: {
277
+ status: 'active',
278
+ name: { $istartsWith: 'a' } // Case-insensitive search
279
+ },
280
+ $limit: 10,
281
+ $skip: 0
282
+ });
283
+ } finally {
284
+ await querier.release(); // Essential for pool health
285
+ }
286
+ ```
287
+
288
+ **Generated SQL (PostgreSQL):**
289
+
290
+ ```sql
291
+ SELECT "User"."name", "profile"."id" AS "profile_id", "profile"."bio" AS "profile_bio"
292
+ FROM "User"
293
+ INNER JOIN "Profile" AS "profile" ON "profile"."userId" = "User"."id"
294
+ WHERE "User"."status" = 'active' AND "User"."name" ILIKE 'a%'
295
+ LIMIT 10 OFFSET 0
296
+ ```
297
+
298
+ &nbsp;
299
+
300
+ ### Advanced: Virtual Fields & Raw SQL
301
+
302
+ Define complex logic directly in your entities using `raw` functions. These are resolved during SQL generation for peak efficiency.
303
+
304
+ ```ts
305
+ @Entity()
306
+ export class Item {
307
+ @Field({
308
+ virtual: raw(({ ctx, dialect, escapedPrefix }) => {
309
+ ctx.append('(');
310
+ dialect.count(ctx, ItemTag, {
311
+ $where: { itemId: raw(({ ctx }) => ctx.append(`${escapedPrefix}.id`)) }
312
+ }, { autoPrefix: true });
313
+ ctx.append(')');
314
+ })
315
+ })
316
+ tagsCount?: number;
317
+ }
318
+ ```
319
+
320
+ &nbsp;
321
+
322
+ ### JSONB Operators & Relation Filtering
323
+
324
+ Query nested JSON fields using **type-safe dot-notation** with full operator support. Wrap fields with `Json<T>` to get IDE autocompletion for valid paths. UQL generates the correct SQL for each dialect.
325
+
326
+ ```ts
327
+ // Filter by nested JSONB field paths
328
+ const items = await querier.findMany(Company, {
329
+ $where: {
330
+ 'settings.isArchived': { $ne: true },
331
+ 'settings.priority': { $gte: 5 },
332
+ },
333
+ });
334
+ ```
335
+
336
+ **PostgreSQL:** `WHERE ("settings"->>'isArchived') IS DISTINCT FROM $1 AND (("settings"->>'priority'))::numeric >= $2`
337
+ **SQLite:** `WHERE json_extract("settings", '$.isArchived') IS NOT ? AND CAST(json_extract("settings", '$.priority') AS REAL) >= ?`
338
+
339
+ Filter parent entities by their **ManyToMany** or **OneToMany** relations using automatic EXISTS subqueries:
340
+
341
+ ```ts
342
+ // Find posts that have a tag named 'typescript'
343
+ const posts = await querier.findMany(Post, {
344
+ $where: { tags: { name: 'typescript' } },
345
+ });
346
+ ```
347
+
348
+ **PostgreSQL:** `WHERE EXISTS (SELECT 1 FROM "PostTag" WHERE "PostTag"."postId" = "Post"."id" AND "PostTag"."tagId" IN (SELECT "Tag"."id" FROM "Tag" WHERE "Tag"."name" = $1))`
349
+
350
+ > **Pro Tip**: Wrap JSONB field types with `Json<T>` (e.g., `settings?: Json<{ isArchived?: boolean }>`) to get IDE autocompletion for dot-notation paths.
351
+
352
+ &nbsp;
353
+
354
+ ### Thread-Safe Transactions
355
+
356
+ UQL is one of the few ORMs with a **centralized serialization engine**. Transactions are guaranteed to be race-condition free.
357
+
358
+ #### Option A: Manual (Functional)
359
+
360
+ ```ts
361
+ const result = await pool.transaction(async (querier) => {
362
+ const user = await querier.findOne(User, { $where: { email: '...' } });
363
+ await querier.insertOne(Profile, { userId: user.id, bio: '...' });
364
+ });
365
+ ```
366
+
367
+ #### Option B: Declarative (Decorators)
368
+
369
+ Perfect for **NestJS** and other Dependency Injection frameworks. Use `@Transactional()` to wrap a method and `@InjectQuerier()` to access the managed connection.
370
+
371
+ ```ts
372
+ import { Transactional, InjectQuerier, type Querier } from 'uql-orm';
373
+
374
+ export class UserService {
375
+ @Transactional()
376
+ async register({picture, ...user}: UserProfile, @InjectQuerier() querier?: Querier) {
377
+ const userId = await querier.insertOne(User, user);
378
+ await querier.insertOne(Profile, { userId, picture });
379
+ }
380
+ }
381
+ ```
382
+
383
+ #### Option C: Imperative
384
+
385
+ For granular control over the transaction lifecycle, manage `begin`, `commit`, `rollback`, and `release` yourself.
386
+
387
+ ```ts
388
+ const querier = await pool.getQuerier();
389
+ try {
390
+ await querier.beginTransaction();
391
+
392
+ const userId = await querier.insertOne(User, { name: '...' });
393
+ await querier.insertOne(Profile, { userId, picture: '...' });
394
+
395
+ await querier.commitTransaction();
396
+ } catch (error) {
397
+ await querier.rollbackTransaction();
398
+ throw error;
399
+ } finally {
400
+ await querier.release();
401
+ }
402
+ ```
403
+
404
+ &nbsp;
405
+
406
+ ## 5. Migrations & Synchronization
407
+
408
+ ### 1. Unified Configuration
409
+
410
+ Ideally, use the same `uql.config.ts` for your application bootstrap and the CLI:
411
+
412
+ ```ts
413
+ // uql.config.ts
414
+ import type { Config } from 'uql-orm';
415
+
416
+ export default {
417
+ pool: new PgQuerierPool({ /* ... */ }),
418
+ entities: [User, Profile, Post],
419
+ migrationsPath: './migrations',
420
+ } satisfies Config;
421
+ ```
422
+
423
+ **Why?** Using a single config for both your app and the CLI is recommended for consistency. It prevents bugs where your runtime uses one naming strategy (e.g. `camelCase`) but your migrations use another (e.g. `snake_case`), or where the CLI isn't aware of all your entities. It enforces a Single Source of Truth for your database connection and schema.
424
+
425
+ ### 2. Manage via CLI
426
+
427
+ Use the CLI to manage your database schema evolution.
428
+
429
+ | Command | Description |
430
+ | :--- | :--- |
431
+ | `generate:from-db` | **Scaffolds Entities** from an existing database. Includes **Smart Relation Detection**. |
432
+ | `generate <name>` | Creates an empty timestamped file for **manual** SQL migrations (e.g., data backfills). |
433
+ | `generate:entities <name>` | **Auto-generates** a migration by diffing your entities against the current DB schema. |
434
+ | `drift:check` | **Drift Detection**: Compares your defined entities against the actual database schema and reports discrepancies. |
435
+ | `up` | Applies all pending migrations. |
436
+ | `down` | Rolls back the last applied migration batch. |
437
+ | `status` | Shows which migrations have been executed and which are pending. |
438
+
439
+ #### Usage Examples
440
+
441
+ ```bash
442
+ # 1. Create a manual migration
443
+ npx uql-migrate generate seed_default_roles
444
+
445
+ # 2. Auto-generate schema changes from your code
446
+ npx uql-migrate generate:entities add_profile_table
447
+
448
+ # 3. Apply changes
449
+ npx uql-migrate up
450
+
451
+ # 4. Check for schema drift (Production Safety)
452
+ npx uql-migrate drift:check
453
+
454
+ # 5. Scaffold entities from an existing DB (Legacy Adoption)
455
+ npx uql-migrate generate:from-db --output ./src/entities
456
+ ```
457
+
458
+ > **Bun Users**: If your `uql.config.ts` uses TypeScript path aliases (e.g., `~app/...`), run migrations with the `--bun` flag to ensure proper resolution:
459
+ > ```bash
460
+ > bun run --bun uql-migrate status
461
+ > ```
462
+ > Or add a script to your `package.json`: `"uql": "bun run --bun uql-migrate"`, then run commands like, e.g., `bun run uql status`.
463
+
464
+ ### 3. AutoSync (Development)
465
+
466
+ Keep your schema in sync without manual migrations. It is **Safe by Default**: In safe mode (default), it strictly **adds** new tables and columns but **blocks** any destructive operations (column drops or type alterations) to prevent data loss. It provides **Transparent Feedback** by logging detailed warnings for any blocked changes, so you know exactly what remains to be migrated manually.
467
+
468
+ **New Capabilities (v3.8+):**
469
+
470
+ * **Schema AST Engine**: Uses a graph-based representation of your schema for 100% accurate diffing, handling circular dependencies and correct topological sort orders for table creation/dropping.
471
+ * **Smart Relation Detection**: When generating entities from an existing DB, UQL automatically detects relationships (OneToOne, ManyToMany) via foreign key structures and naming conventions (`user_id` -> `User`).
472
+ * **Bidirectional Index Sync**: Indexes defined in `@Field({ index: true })` or `@Index()` are synced to the DB, and indexes found in the DB are reflected in generated entities.
473
+
474
+ > **Important**: For `autoSync` to detect your entities, they must be **loaded** (imported) before calling `autoSync`.
475
+
476
+ **Using Your Config (Recommended)**
477
+
478
+ If you follow the [unified configuration](#1-unified-configuration) pattern, your entities are already imported. Simply reuse it:
479
+
480
+ ```ts
481
+ import { Migrator } from 'uql-orm/migrate';
482
+ import config from './uql.config.js';
483
+
484
+ const migrator = new Migrator(config.pool, {
485
+ entities: config.entities,
486
+ });
487
+ await migrator.autoSync({ logging: true });
488
+ ```
489
+
490
+ **Explicit Entities**
491
+
492
+ Alternatively, pass entities directly if you want to be explicit about which entities to sync:
493
+
494
+ ```ts
495
+ import { Migrator } from 'uql-orm/migrate';
496
+ import { User, Profile, Post } from './entities/index.js';
497
+
498
+ const migrator = new Migrator(pool, {
499
+ entities: [User, Profile, Post],
500
+ });
501
+ await migrator.autoSync({ logging: true });
502
+ ```
503
+
504
+ &nbsp;
505
+
506
+ ## 6. Logging & Monitoring
507
+
508
+ UQL features a professional-grade, structured logging system designed for high visibility and sub-millisecond performance monitoring.
509
+
510
+ ### Log Levels
511
+
512
+ | Level | Description |
513
+ | :-------------------- | :-------------------------------------------------------------------------------------- |
514
+ | `query` | **Standard Queries**: Beautifully formatted SQL/Command logs with execution time. |
515
+ | `slowQuery` | **Bottleneck Alerts**: Dedicated logging for queries exceeding your threshold. Use `logParams: false` to omit sensitive data. |
516
+ | `error` / `warn` | **System Health**: Detailed error traces and potential issue warnings. |
517
+ | `migration` | **Audit Trail**: Step-by-step history of schema changes. |
518
+ | `skippedMigration` | **Safety**: Logs blocked unsafe schema changes during autoSync. |
519
+ | `schema` / `info` | **Lifecycle**: Informative logs about ORM initialization and sync events. |
520
+
521
+ ### Visual Feedback
522
+
523
+ The `DefaultLogger` provides high-contrast, colored output out of the box:
524
+
525
+ ```text
526
+ query: SELECT * FROM "user" WHERE "id" = $1 -- [123] [2ms]
527
+ slow query: UPDATE "post" SET "title" = $1 -- ["New Title"] [1250ms]
528
+ error: Failed to connect to database: Connection timeout
529
+ ```
530
+
531
+ > **Pro Tip**: Even if you disable general query logging in production (`logger: ['error', 'warn', 'slowQuery']`), UQL stays silent *until* a query exceeds your threshold.
532
+
533
+ &nbsp;
534
+
535
+ Learn more about UQL at [uql-orm.dev](https://uql-orm.dev) for details on:
536
+
537
+ - [Complex Logical Operators](https://uql-orm.dev/querying/logical-operators)
538
+ - [Relationship Mapping (1-1, 1-M, M-M)](https://uql-orm.dev/querying/relations)
539
+ - [Lifecycle Hooks](https://uql-orm.dev/entities/lifecycle-hooks)
540
+ - [Soft Deletes &amp; Auditing](https://uql-orm.dev/entities/soft-delete)
541
+ - [Database Migration &amp; Syncing](https://uql-orm.dev/migrations)
542
+
543
+ &nbsp;
544
+
545
+ ## 🛠 Deep Dive: Tests & Technical Resources
546
+
547
+ For those who want to see the "engine under the hood," check out these resources in the source code:
548
+
549
+ - **Entity Mocks**: See how complex entities and virtual fields are defined in [entityMock.ts](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/test/entityMock.ts).
550
+ - **Core Dialect Logic**: The foundation of our context-aware SQL generation in [abstractSqlDialect.ts](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/dialect/abstractSqlDialect.ts).
551
+ - **Comprehensive Test Suite**:
552
+ - [Abstract SQL Spec](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/dialect/abstractSqlDialect-spec.ts): Base test suite for all dialects.
553
+ - [PostgreSQL](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/postgres/postgresDialect.spec.ts) \| [MySQL](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/mysql/mysqlDialect.spec.ts) \| [SQLite](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/sqlite/sqliteDialect.spec.ts) specs.
554
+ - [Querier Integration Tests](https://github.com/rogerpadilla/uql/blob/main/packages/uql-orm/src/querier/abstractSqlQuerier-spec.ts): SQL generation & connection management tests.
555
+
556
+ &nbsp;
557
+
558
+ ## Built with ❤️ and supported by
559
+
560
+ UQL is an open-source project proudly sponsored by **[Variability.ai](https://variability.ai)**.