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
@@ -0,0 +1,957 @@
1
+ import { getMeta } from '../entity/index.js';
2
+ import { QueryRaw, RAW_ALIAS, RAW_VALUE, } from '../type/index.js';
3
+ import { buildQueryWhereAsMap, buildSortMap, escapeSqlId, fillOnFields, filterFieldKeys, filterRelationKeys, flatObject, getFieldCallbackValue, getFieldKeys, getKeys, hasKeys, isJsonType, isSelectingRelations, raw, } from '../util/index.js';
4
+ import { AbstractDialect } from './abstractDialect.js';
5
+ import { SqlQueryContext } from './queryContext.js';
6
+ export class AbstractSqlDialect extends AbstractDialect {
7
+ get escapeIdChar() {
8
+ return this.config.quoteChar;
9
+ }
10
+ get beginTransactionCommand() {
11
+ return this.config.beginTransactionCommand;
12
+ }
13
+ get commitTransactionCommand() {
14
+ return this.config.commitTransactionCommand;
15
+ }
16
+ get rollbackTransactionCommand() {
17
+ return this.config.rollbackTransactionCommand;
18
+ }
19
+ createContext() {
20
+ return new SqlQueryContext(this);
21
+ }
22
+ addValue(values, value) {
23
+ values.push(value ?? null);
24
+ return this.placeholder(values.length);
25
+ }
26
+ placeholder(_index) {
27
+ return '?';
28
+ }
29
+ returningId(entity) {
30
+ const meta = getMeta(entity);
31
+ const idKey = (meta.id ?? 'id');
32
+ const idName = this.resolveColumnName(idKey, meta.fields[idKey]);
33
+ return `RETURNING ${this.escapeId(idName)} ${this.escapeId('id')}`;
34
+ }
35
+ search(ctx, entity, q = {}, opts = {}) {
36
+ const meta = getMeta(entity);
37
+ const tableName = this.resolveTableName(entity, meta);
38
+ const prefix = (opts.prefix ?? (opts.autoPrefix || isSelectingRelations(meta, q.$select))) ? tableName : undefined;
39
+ opts = { ...opts, prefix };
40
+ this.where(ctx, entity, q.$where, opts);
41
+ this.sort(ctx, entity, q.$sort, opts);
42
+ this.pager(ctx, q);
43
+ }
44
+ selectFields(ctx, entity, select, opts = {}) {
45
+ const meta = getMeta(entity);
46
+ const prefix = opts.prefix ? opts.prefix + '.' : '';
47
+ const escapedPrefix = this.escapeId(opts.prefix, true, true);
48
+ let selectArr;
49
+ if (select) {
50
+ if (Array.isArray(select)) {
51
+ // Internal-only path: raw SQL expressions passed as QueryRaw[]
52
+ selectArr = select;
53
+ }
54
+ else {
55
+ const positiveFields = [];
56
+ const negativeFields = [];
57
+ for (const prop in select) {
58
+ if (!(prop in meta.fields)) {
59
+ continue;
60
+ }
61
+ const val = select[prop];
62
+ if (val) {
63
+ positiveFields.push(prop);
64
+ }
65
+ else {
66
+ negativeFields.push(prop);
67
+ }
68
+ }
69
+ selectArr = positiveFields.length
70
+ ? positiveFields
71
+ : getFieldKeys(meta.fields).filter((it) => !negativeFields.includes(it));
72
+ }
73
+ const id = meta.id;
74
+ if (id && opts.prefix && !selectArr.includes(id)) {
75
+ selectArr = [id, ...selectArr];
76
+ }
77
+ }
78
+ else {
79
+ selectArr = getFieldKeys(meta.fields);
80
+ }
81
+ if (!selectArr.length) {
82
+ ctx.append(escapedPrefix + '*');
83
+ return;
84
+ }
85
+ selectArr.forEach((key, index) => {
86
+ if (index > 0)
87
+ ctx.append(', ');
88
+ if (key instanceof QueryRaw) {
89
+ this.getRawValue(ctx, {
90
+ value: key,
91
+ prefix: opts.prefix,
92
+ escapedPrefix,
93
+ autoPrefixAlias: opts.autoPrefixAlias,
94
+ });
95
+ }
96
+ else {
97
+ const field = meta.fields[key];
98
+ if (!field)
99
+ return;
100
+ const columnName = this.resolveColumnName(key, field);
101
+ if (field.virtual) {
102
+ this.getRawValue(ctx, {
103
+ value: raw(field.virtual[RAW_VALUE], key),
104
+ prefix: opts.prefix,
105
+ escapedPrefix,
106
+ autoPrefixAlias: opts.autoPrefixAlias,
107
+ });
108
+ }
109
+ else {
110
+ ctx.append(escapedPrefix + this.escapeId(columnName));
111
+ }
112
+ if (!field.virtual && (columnName !== key || opts.autoPrefixAlias)) {
113
+ const aliasStr = prefix + key;
114
+ // Replace dots with underscores for alias to avoid syntax errors
115
+ const safeAlias = aliasStr.replace(/\./g, '_');
116
+ ctx.append(' ' + this.escapeId(safeAlias, true));
117
+ }
118
+ }
119
+ });
120
+ }
121
+ select(ctx, entity, select, opts = {}) {
122
+ const meta = getMeta(entity);
123
+ const tableName = this.resolveTableName(entity, meta);
124
+ const mapSelect = Array.isArray(select) ? undefined : select;
125
+ const prefix = (opts.prefix ?? (opts.autoPrefix || isSelectingRelations(meta, mapSelect))) ? tableName : undefined;
126
+ ctx.append('SELECT ');
127
+ this.selectFields(ctx, entity, select, { prefix });
128
+ // Add related fields BEFORE FROM clause
129
+ this.selectRelationFields(ctx, entity, mapSelect, { prefix });
130
+ ctx.append(` FROM ${this.escapeId(tableName)}`);
131
+ // Add JOINs AFTER FROM clause
132
+ this.selectRelationJoins(ctx, entity, mapSelect, { prefix });
133
+ }
134
+ selectRelationFields(ctx, entity, select, opts = {}) {
135
+ this.forEachJoinableRelation(entity, select, opts, (relEntity, relQuery, joinRelAlias) => {
136
+ ctx.append(', ');
137
+ this.selectFields(ctx, relEntity, relQuery.$select, { prefix: joinRelAlias, autoPrefixAlias: true });
138
+ this.selectRelationFields(ctx, relEntity, relQuery.$select, { prefix: joinRelAlias });
139
+ });
140
+ }
141
+ selectRelationJoins(ctx, entity, select, opts = {}) {
142
+ this.forEachJoinableRelation(entity, select, opts, (relEntity, relQuery, joinRelAlias, relOpts, meta, tableName, required) => {
143
+ const relMeta = getMeta(relEntity);
144
+ const relTableName = this.resolveTableName(relEntity, relMeta);
145
+ const relEntityName = this.escapeId(relTableName);
146
+ const relPath = opts.prefix ? this.escapeId(opts.prefix, true) : this.escapeId(tableName);
147
+ const joinType = required ? 'INNER' : 'LEFT';
148
+ const joinAlias = this.escapeId(joinRelAlias, true);
149
+ ctx.append(` ${joinType} JOIN ${relEntityName} ${joinAlias} ON `);
150
+ ctx.append((relOpts.references ?? [])
151
+ .map((it) => {
152
+ const relField = relMeta.fields[it.foreign];
153
+ const field = meta.fields[it.local];
154
+ const foreignColumnName = this.resolveColumnName(it.foreign, relField);
155
+ const localColumnName = this.resolveColumnName(it.local, field);
156
+ return `${joinAlias}.${this.escapeId(foreignColumnName)} = ${relPath}.${this.escapeId(localColumnName)}`;
157
+ })
158
+ .join(' AND '));
159
+ if (relQuery.$where) {
160
+ ctx.append(' AND ');
161
+ this.where(ctx, relEntity, relQuery.$where, { prefix: joinRelAlias, clause: false });
162
+ }
163
+ this.selectRelationJoins(ctx, relEntity, relQuery.$select, { prefix: joinRelAlias });
164
+ });
165
+ }
166
+ /**
167
+ * Iterates over joinable (11/m1) relations for a given select, resolving shared metadata.
168
+ * Used by both `selectRelationFields` and `selectRelationJoins` to avoid duplicated iteration logic.
169
+ */
170
+ forEachJoinableRelation(entity, select, opts, callback) {
171
+ if (!select)
172
+ return;
173
+ const meta = getMeta(entity);
174
+ const tableName = this.resolveTableName(entity, meta);
175
+ const relKeys = filterRelationKeys(meta, select);
176
+ const prefix = opts.prefix;
177
+ for (const relKey of relKeys) {
178
+ const relOpts = meta.relations[relKey];
179
+ if (!relOpts || relOpts.cardinality === '1m' || relOpts.cardinality === 'mm' || !relOpts.entity)
180
+ continue;
181
+ const isFirstLevel = prefix === tableName;
182
+ const joinRelAlias = isFirstLevel ? relKey : prefix ? `${prefix}.${relKey}` : relKey;
183
+ const relEntity = relOpts.entity();
184
+ const relSelect = select?.[relKey];
185
+ let relQuery;
186
+ let required = false;
187
+ if (isRelationSelectQuery(relSelect)) {
188
+ relQuery = relSelect;
189
+ required = relSelect.$required === true;
190
+ }
191
+ else if (Array.isArray(relSelect)) {
192
+ relQuery = { $select: relSelect };
193
+ }
194
+ else {
195
+ relQuery = {};
196
+ }
197
+ callback(relEntity, relQuery, joinRelAlias, relOpts, meta, tableName, required);
198
+ }
199
+ }
200
+ where(ctx, entity, where = {}, opts = {}) {
201
+ const meta = getMeta(entity);
202
+ const { usePrecedence, clause = 'WHERE', softDelete } = opts;
203
+ where = buildQueryWhereAsMap(meta, where);
204
+ if (meta.softDelete &&
205
+ (softDelete || softDelete === undefined) &&
206
+ !where[meta.softDelete]) {
207
+ where[meta.softDelete] = null;
208
+ }
209
+ const entries = Object.entries(where);
210
+ if (!entries.length) {
211
+ return;
212
+ }
213
+ if (clause) {
214
+ ctx.append(` ${clause} `);
215
+ }
216
+ if (usePrecedence) {
217
+ ctx.append('(');
218
+ }
219
+ const startLength = ctx.sql.length;
220
+ getKeys(where).forEach((key) => {
221
+ const val = where[key];
222
+ if (val === undefined)
223
+ return;
224
+ if (ctx.sql.length > startLength) {
225
+ ctx.append(' AND ');
226
+ }
227
+ this.compare(ctx, entity, key, val, {
228
+ ...opts,
229
+ usePrecedence: getKeys(where).length > 1,
230
+ });
231
+ });
232
+ if (usePrecedence) {
233
+ ctx.append(')');
234
+ }
235
+ }
236
+ compare(ctx, entity, key, val, opts = {}) {
237
+ const meta = getMeta(entity);
238
+ if (val instanceof QueryRaw) {
239
+ if (key === '$exists' || key === '$nexists') {
240
+ ctx.append(key === '$exists' ? 'EXISTS (' : 'NOT EXISTS (');
241
+ const tableName = this.resolveTableName(entity, meta);
242
+ this.getRawValue(ctx, {
243
+ value: val,
244
+ prefix: tableName,
245
+ escapedPrefix: this.escapeId(tableName, false, true),
246
+ });
247
+ ctx.append(')');
248
+ return;
249
+ }
250
+ this.getComparisonKey(ctx, entity, key, opts);
251
+ ctx.append(' = ');
252
+ this.getRawValue(ctx, { value: val });
253
+ return;
254
+ }
255
+ if (key === '$text') {
256
+ const search = val;
257
+ const searchFields = search.$fields ?? getFieldKeys(meta.fields);
258
+ const fields = searchFields.map((fKey) => {
259
+ const field = meta.fields[fKey];
260
+ const columnName = this.resolveColumnName(fKey, field);
261
+ return this.escapeId(columnName);
262
+ });
263
+ ctx.append(`MATCH(${fields.join(', ')}) AGAINST(`);
264
+ ctx.addValue(search.$value);
265
+ ctx.append(')');
266
+ return;
267
+ }
268
+ if (key === '$and' || key === '$or' || key === '$not' || key === '$nor') {
269
+ this.compareLogicalOperator(ctx, entity, key, val, opts);
270
+ return;
271
+ }
272
+ // Detect JSONB dot-notation: 'column.path' where column is a registered JSON/JSONB field
273
+ const keyStr = key;
274
+ const jsonDot = this.resolveJsonDotPath(meta, keyStr, opts.prefix);
275
+ if (jsonDot) {
276
+ this.compareJsonPath(ctx, jsonDot, val);
277
+ return;
278
+ }
279
+ // Detect relation filtering: key is a known relation with 'mm' or '1m' cardinality
280
+ const rel = meta.relations[keyStr];
281
+ if (rel && (rel.cardinality === 'mm' || rel.cardinality === '1m')) {
282
+ this.compareRelation(ctx, entity, keyStr, val, rel, opts);
283
+ return;
284
+ }
285
+ const value = this.normalizeWhereValue(val);
286
+ const operators = getKeys(value);
287
+ if (operators.length > 1) {
288
+ ctx.append('(');
289
+ }
290
+ operators.forEach((op, index) => {
291
+ if (index > 0) {
292
+ ctx.append(' AND ');
293
+ }
294
+ this.compareFieldOperator(ctx, entity, key, op, value[op], opts);
295
+ });
296
+ if (operators.length > 1) {
297
+ ctx.append(')');
298
+ }
299
+ }
300
+ compareLogicalOperator(ctx, entity, key, val, opts) {
301
+ const negateOperatorMap = {
302
+ $not: '$and',
303
+ $nor: '$or',
304
+ };
305
+ const op = negateOperatorMap[key] ?? key;
306
+ const negate = key in negateOperatorMap ? 'NOT' : '';
307
+ const valArr = val ?? [];
308
+ const hasManyItems = valArr.length > 1;
309
+ if ((opts.usePrecedence || negate) && hasManyItems) {
310
+ ctx.append((negate ? negate + ' ' : '') + '(');
311
+ }
312
+ else if (negate) {
313
+ ctx.append(negate + ' ');
314
+ }
315
+ valArr.forEach((whereEntry, index) => {
316
+ if (index > 0) {
317
+ ctx.append(op === '$or' ? ' OR ' : ' AND ');
318
+ }
319
+ if (whereEntry instanceof QueryRaw) {
320
+ this.getRawValue(ctx, {
321
+ value: whereEntry,
322
+ });
323
+ }
324
+ else if (whereEntry) {
325
+ this.where(ctx, entity, whereEntry, {
326
+ prefix: opts.prefix,
327
+ usePrecedence: hasManyItems && !Array.isArray(whereEntry) && Object.keys(whereEntry).length > 1,
328
+ clause: false,
329
+ });
330
+ }
331
+ });
332
+ if ((opts.usePrecedence || negate) && hasManyItems) {
333
+ ctx.append(')');
334
+ }
335
+ }
336
+ compareFieldOperator(ctx, entity, key, op, val, opts = {}) {
337
+ switch (op) {
338
+ case '$eq':
339
+ this.getComparisonKey(ctx, entity, key, opts);
340
+ if (val === null) {
341
+ ctx.append(' IS NULL');
342
+ }
343
+ else {
344
+ ctx.append(' = ');
345
+ ctx.addValue(val);
346
+ }
347
+ break;
348
+ case '$ne':
349
+ this.getComparisonKey(ctx, entity, key, opts);
350
+ if (val === null) {
351
+ ctx.append(' IS NOT NULL');
352
+ }
353
+ else {
354
+ ctx.append(' <> ');
355
+ ctx.addValue(val);
356
+ }
357
+ break;
358
+ case '$not':
359
+ ctx.append('NOT (');
360
+ this.compare(ctx, entity, key, val, opts);
361
+ ctx.append(')');
362
+ break;
363
+ case '$gt':
364
+ this.getComparisonKey(ctx, entity, key, opts);
365
+ ctx.append(' > ');
366
+ ctx.addValue(val);
367
+ break;
368
+ case '$gte':
369
+ this.getComparisonKey(ctx, entity, key, opts);
370
+ ctx.append(' >= ');
371
+ ctx.addValue(val);
372
+ break;
373
+ case '$lt':
374
+ this.getComparisonKey(ctx, entity, key, opts);
375
+ ctx.append(' < ');
376
+ ctx.addValue(val);
377
+ break;
378
+ case '$lte':
379
+ this.getComparisonKey(ctx, entity, key, opts);
380
+ ctx.append(' <= ');
381
+ ctx.addValue(val);
382
+ break;
383
+ case '$startsWith':
384
+ this.getComparisonKey(ctx, entity, key, opts);
385
+ ctx.append(' LIKE ');
386
+ ctx.addValue(`${val}%`);
387
+ break;
388
+ case '$istartsWith':
389
+ this.getComparisonKey(ctx, entity, key, opts);
390
+ ctx.append(' LIKE ');
391
+ ctx.addValue(`${val.toLowerCase()}%`);
392
+ break;
393
+ case '$endsWith':
394
+ this.getComparisonKey(ctx, entity, key, opts);
395
+ ctx.append(' LIKE ');
396
+ ctx.addValue(`%${val}`);
397
+ break;
398
+ case '$iendsWith':
399
+ this.getComparisonKey(ctx, entity, key, opts);
400
+ ctx.append(' LIKE ');
401
+ ctx.addValue(`%${val.toLowerCase()}`);
402
+ break;
403
+ case '$includes':
404
+ this.getComparisonKey(ctx, entity, key, opts);
405
+ ctx.append(' LIKE ');
406
+ ctx.addValue(`%${val}%`);
407
+ break;
408
+ case '$iincludes':
409
+ this.getComparisonKey(ctx, entity, key, opts);
410
+ ctx.append(' LIKE ');
411
+ ctx.addValue(`%${val.toLowerCase()}%`);
412
+ break;
413
+ case '$ilike':
414
+ this.getComparisonKey(ctx, entity, key, opts);
415
+ ctx.append(' LIKE ');
416
+ ctx.addValue(val.toLowerCase());
417
+ break;
418
+ case '$like':
419
+ this.getComparisonKey(ctx, entity, key, opts);
420
+ ctx.append(' LIKE ');
421
+ ctx.addValue(val);
422
+ break;
423
+ case '$in':
424
+ this.getComparisonKey(ctx, entity, key, opts);
425
+ if (Array.isArray(val) && val.length > 0) {
426
+ ctx.append(' IN (');
427
+ this.addValues(ctx, val);
428
+ ctx.append(')');
429
+ }
430
+ else {
431
+ ctx.append(' IN (NULL)');
432
+ }
433
+ break;
434
+ case '$nin':
435
+ this.getComparisonKey(ctx, entity, key, opts);
436
+ if (Array.isArray(val) && val.length > 0) {
437
+ ctx.append(' NOT IN (');
438
+ this.addValues(ctx, val);
439
+ ctx.append(')');
440
+ }
441
+ else {
442
+ ctx.append(' NOT IN (NULL)');
443
+ }
444
+ break;
445
+ case '$regex':
446
+ this.getComparisonKey(ctx, entity, key, opts);
447
+ ctx.append(' REGEXP ');
448
+ ctx.addValue(val);
449
+ break;
450
+ case '$between': {
451
+ const [min, max] = val;
452
+ this.getComparisonKey(ctx, entity, key, opts);
453
+ ctx.append(' BETWEEN ');
454
+ ctx.addValue(min);
455
+ ctx.append(' AND ');
456
+ ctx.addValue(max);
457
+ break;
458
+ }
459
+ case '$isNull':
460
+ this.getComparisonKey(ctx, entity, key, opts);
461
+ ctx.append(val ? ' IS NULL' : ' IS NOT NULL');
462
+ break;
463
+ case '$isNotNull':
464
+ this.getComparisonKey(ctx, entity, key, opts);
465
+ ctx.append(val ? ' IS NOT NULL' : ' IS NULL');
466
+ break;
467
+ case '$all':
468
+ case '$size':
469
+ case '$elemMatch':
470
+ // Each SQL dialect must provide its own implementation
471
+ throw TypeError(`${op} is not supported in the base SQL dialect - override in dialect subclass`);
472
+ default:
473
+ throw TypeError(`unknown operator: ${op}`);
474
+ }
475
+ }
476
+ addValues(ctx, vals) {
477
+ vals.forEach((val, index) => {
478
+ if (index > 0) {
479
+ ctx.append(', ');
480
+ }
481
+ ctx.addValue(val);
482
+ });
483
+ }
484
+ /**
485
+ * Build a comparison condition for a JSON field.
486
+ * Used by both `$elemMatch` and dot-notation paths. Each dialect provides a `JsonFieldConfig`.
487
+ */
488
+ buildJsonFieldCondition(ctx, config, jsonPath, op, value) {
489
+ const jsonField = config.fieldAccessor(jsonPath);
490
+ switch (op) {
491
+ case '$eq':
492
+ return value === null ? `${jsonField} IS NULL` : `${jsonField} = ${config.addValue(ctx, value)}`;
493
+ case '$ne':
494
+ if (value === null)
495
+ return `${jsonField} IS NOT NULL`;
496
+ return config.neExpr
497
+ ? config.neExpr(jsonField, config.addValue(ctx, value))
498
+ : `${jsonField} <> ${config.addValue(ctx, value)}`;
499
+ case '$gt':
500
+ return `${config.numericCast(jsonField)} > ${config.addValue(ctx, value)}`;
501
+ case '$gte':
502
+ return `${config.numericCast(jsonField)} >= ${config.addValue(ctx, value)}`;
503
+ case '$lt':
504
+ return `${config.numericCast(jsonField)} < ${config.addValue(ctx, value)}`;
505
+ case '$lte':
506
+ return `${config.numericCast(jsonField)} <= ${config.addValue(ctx, value)}`;
507
+ case '$like':
508
+ return `${jsonField} ${config.likeFn} ${config.addValue(ctx, value)}`;
509
+ case '$ilike':
510
+ return config.ilikeExpr(jsonField, config.addValue(ctx, value.toLowerCase()));
511
+ case '$startsWith':
512
+ return `${jsonField} ${config.likeFn} ${config.addValue(ctx, `${value}%`)}`;
513
+ case '$istartsWith':
514
+ return config.ilikeExpr(jsonField, config.addValue(ctx, `${value.toLowerCase()}%`));
515
+ case '$endsWith':
516
+ return `${jsonField} ${config.likeFn} ${config.addValue(ctx, `%${value}`)}`;
517
+ case '$iendsWith':
518
+ return config.ilikeExpr(jsonField, config.addValue(ctx, `%${value.toLowerCase()}`));
519
+ case '$includes':
520
+ return `${jsonField} ${config.likeFn} ${config.addValue(ctx, `%${value}%`)}`;
521
+ case '$iincludes':
522
+ return config.ilikeExpr(jsonField, config.addValue(ctx, `%${value.toLowerCase()}%`));
523
+ case '$regex':
524
+ return `${jsonField} ${config.regexpOp} ${config.addValue(ctx, value)}`;
525
+ case '$in': {
526
+ if (config.inExpr) {
527
+ return config.inExpr(jsonField, config.addValue(ctx, value));
528
+ }
529
+ const inVals = value;
530
+ return `${jsonField} IN (${inVals.map((v) => config.addValue(ctx, v)).join(', ')})`;
531
+ }
532
+ case '$nin': {
533
+ if (config.ninExpr) {
534
+ return config.ninExpr(jsonField, config.addValue(ctx, value));
535
+ }
536
+ const ninVals = value;
537
+ return `${jsonField} NOT IN (${ninVals.map((v) => config.addValue(ctx, v)).join(', ')})`;
538
+ }
539
+ default:
540
+ throw TypeError(`JSON field condition does not support operator: ${op}`);
541
+ }
542
+ }
543
+ getComparisonKey(ctx, entity, key, { prefix } = {}) {
544
+ const meta = getMeta(entity);
545
+ const escapedPrefix = this.escapeId(prefix, true, true);
546
+ const field = meta.fields[key];
547
+ if (field?.virtual) {
548
+ this.getRawValue(ctx, {
549
+ value: field.virtual,
550
+ prefix,
551
+ escapedPrefix,
552
+ });
553
+ return;
554
+ }
555
+ const columnName = this.resolveColumnName(key, field);
556
+ ctx.append(escapedPrefix + this.escapeId(columnName));
557
+ }
558
+ sort(ctx, entity, sort, { prefix }) {
559
+ const sortMap = buildSortMap(sort);
560
+ if (!hasKeys(sortMap)) {
561
+ return;
562
+ }
563
+ const meta = getMeta(entity);
564
+ const flattenedSort = flatObject(sortMap, prefix);
565
+ const directionMap = { 1: '', asc: '', '-1': ' DESC', desc: ' DESC' };
566
+ ctx.append(' ORDER BY ');
567
+ Object.entries(flattenedSort).forEach(([key, sort], index) => {
568
+ if (index > 0) {
569
+ ctx.append(', ');
570
+ }
571
+ const direction = directionMap[sort];
572
+ // Detect JSONB dot-notation: 'column.path'
573
+ const jsonDot = this.resolveJsonDotPath(meta, key);
574
+ if (jsonDot) {
575
+ ctx.append(jsonDot.config.fieldAccessor(jsonDot.jsonPath) + direction);
576
+ return;
577
+ }
578
+ const field = meta.fields[key];
579
+ const name = this.resolveColumnName(key, field);
580
+ ctx.append(this.escapeId(name) + direction);
581
+ });
582
+ }
583
+ pager(ctx, opts) {
584
+ if (opts.$limit) {
585
+ ctx.append(` LIMIT ${Number(opts.$limit)}`);
586
+ }
587
+ if (opts.$skip !== undefined) {
588
+ ctx.append(` OFFSET ${Number(opts.$skip)}`);
589
+ }
590
+ }
591
+ count(ctx, entity, q, opts) {
592
+ const search = { ...q };
593
+ delete search.$sort;
594
+ this.select(ctx, entity, [raw('COUNT(*)', 'count')]);
595
+ this.search(ctx, entity, search, opts);
596
+ }
597
+ find(ctx, entity, q = {}, opts) {
598
+ this.select(ctx, entity, q.$select, opts);
599
+ this.search(ctx, entity, q, opts);
600
+ }
601
+ insert(ctx, entity, payload, opts) {
602
+ const meta = getMeta(entity);
603
+ const payloads = fillOnFields(meta, payload, 'onInsert');
604
+ const keys = filterFieldKeys(meta, payloads[0], 'onInsert');
605
+ const columns = keys.map((key) => {
606
+ const field = meta.fields[key];
607
+ return this.escapeId(this.resolveColumnName(key, field));
608
+ });
609
+ const tableName = this.resolveTableName(entity, meta);
610
+ ctx.append(`INSERT INTO ${this.escapeId(tableName)} (${columns.join(', ')}) VALUES (`);
611
+ payloads.forEach((it, recordIndex) => {
612
+ if (recordIndex > 0) {
613
+ ctx.append('), (');
614
+ }
615
+ keys.forEach((key, keyIndex) => {
616
+ if (keyIndex > 0) {
617
+ ctx.append(', ');
618
+ }
619
+ const field = meta.fields[key];
620
+ this.formatPersistableValue(ctx, field, it[key]);
621
+ });
622
+ });
623
+ ctx.append(')');
624
+ }
625
+ update(ctx, entity, q, payload, opts) {
626
+ const meta = getMeta(entity);
627
+ const [filledPayload] = fillOnFields(meta, payload, 'onUpdate');
628
+ const keys = filterFieldKeys(meta, filledPayload, 'onUpdate');
629
+ const tableName = this.resolveTableName(entity, meta);
630
+ ctx.append(`UPDATE ${this.escapeId(tableName)} SET `);
631
+ keys.forEach((key, index) => {
632
+ if (index > 0) {
633
+ ctx.append(', ');
634
+ }
635
+ const field = meta.fields[key];
636
+ const columnName = this.resolveColumnName(key, field);
637
+ const escapedCol = this.escapeId(columnName);
638
+ const value = filledPayload[key];
639
+ if (this.isJsonMergeOp(value)) {
640
+ this.formatJsonMerge(ctx, escapedCol, value);
641
+ }
642
+ else {
643
+ ctx.append(`${escapedCol} = `);
644
+ this.formatPersistableValue(ctx, field, value);
645
+ }
646
+ });
647
+ this.search(ctx, entity, q, opts);
648
+ }
649
+ upsert(ctx, entity, conflictPaths, payload) {
650
+ const meta = getMeta(entity);
651
+ const update = this.getUpsertUpdateAssignments(ctx, meta, conflictPaths, payload, (name) => `VALUES(${name})`);
652
+ if (update) {
653
+ this.insert(ctx, entity, payload);
654
+ ctx.append(` ON DUPLICATE KEY UPDATE ${update}`);
655
+ }
656
+ else {
657
+ const insertCtx = this.createContext();
658
+ this.insert(insertCtx, entity, payload);
659
+ ctx.append(insertCtx.sql.replace(/^INSERT/, 'INSERT IGNORE'));
660
+ insertCtx.values.forEach((val) => {
661
+ ctx.pushValue(val);
662
+ });
663
+ }
664
+ }
665
+ getUpsertUpdateAssignments(ctx, meta, conflictPaths, payload, callback) {
666
+ const sample = Array.isArray(payload) ? payload[0] : payload;
667
+ const [filledPayload] = fillOnFields(meta, sample, 'onUpdate');
668
+ const fields = filterFieldKeys(meta, filledPayload, 'onUpdate');
669
+ return fields
670
+ .filter((col) => !conflictPaths[col])
671
+ .map((col) => {
672
+ const field = meta.fields[col];
673
+ const columnName = this.resolveColumnName(col, field);
674
+ if (callback) {
675
+ return `${this.escapeId(columnName)} = ${callback(this.escapeId(columnName))}`;
676
+ }
677
+ const valCtx = this.createContext();
678
+ this.formatPersistableValue(valCtx, field, filledPayload[col]);
679
+ valCtx.values.forEach((val) => {
680
+ ctx.pushValue(val);
681
+ });
682
+ return `${this.escapeId(columnName)} = ${valCtx.sql}`;
683
+ })
684
+ .join(', ');
685
+ }
686
+ getUpsertConflictPathsStr(meta, conflictPaths) {
687
+ return getKeys(conflictPaths)
688
+ .map((key) => {
689
+ const field = meta.fields[key];
690
+ const columnName = this.resolveColumnName(key, field);
691
+ return this.escapeId(columnName);
692
+ })
693
+ .join(', ');
694
+ }
695
+ delete(ctx, entity, q, opts = {}) {
696
+ const meta = getMeta(entity);
697
+ const tableName = this.resolveTableName(entity, meta);
698
+ if (opts.softDelete || opts.softDelete === undefined) {
699
+ if (meta.softDelete) {
700
+ const field = meta.fields[meta.softDelete];
701
+ if (!field?.onDelete)
702
+ return;
703
+ const value = getFieldCallbackValue(field.onDelete);
704
+ const columnName = this.resolveColumnName(meta.softDelete, field);
705
+ ctx.append(`UPDATE ${this.escapeId(tableName)} SET ${this.escapeId(columnName)} = `);
706
+ ctx.addValue(value);
707
+ this.search(ctx, entity, q, opts);
708
+ return;
709
+ }
710
+ if (opts.softDelete) {
711
+ throw TypeError(`'${tableName}' has not enabled 'softDelete'`);
712
+ }
713
+ }
714
+ ctx.append(`DELETE FROM ${this.escapeId(tableName)}`);
715
+ this.search(ctx, entity, q, opts);
716
+ }
717
+ escapeId(val, forbidQualified, addDot) {
718
+ return escapeSqlId(val, this.escapeIdChar, forbidQualified, addDot);
719
+ }
720
+ getPersistables(ctx, meta, payload, callbackKey) {
721
+ const payloads = fillOnFields(meta, payload, callbackKey);
722
+ return payloads.map((it) => this.getPersistable(ctx, meta, it, callbackKey));
723
+ }
724
+ getPersistable(ctx, meta, payload, callbackKey) {
725
+ const filledPayload = fillOnFields(meta, payload, callbackKey)[0];
726
+ const keys = filterFieldKeys(meta, filledPayload, callbackKey);
727
+ return keys.reduce((acc, key) => {
728
+ const field = meta.fields[key];
729
+ const valCtx = this.createContext();
730
+ this.formatPersistableValue(valCtx, field, filledPayload[key]);
731
+ valCtx.values.forEach((val) => {
732
+ ctx.pushValue(val);
733
+ });
734
+ acc[key] = valCtx.sql;
735
+ return acc;
736
+ }, {});
737
+ }
738
+ formatPersistableValue(ctx, field, value) {
739
+ if (value instanceof QueryRaw) {
740
+ this.getRawValue(ctx, { value });
741
+ return;
742
+ }
743
+ if (isJsonType(field?.type)) {
744
+ ctx.addValue(value ? JSON.stringify(value) : null);
745
+ return;
746
+ }
747
+ if (field?.type === 'vector' && Array.isArray(value)) {
748
+ ctx.addValue(`[${value.join(',')}]`);
749
+ return;
750
+ }
751
+ ctx.addValue(value);
752
+ }
753
+ /**
754
+ * Generate SQL for a JSONB merge and/or unset operation.
755
+ * Called from `update()` when a field value has `$merge` and/or `$unset` operators.
756
+ * Generates the full `"col" = <expression>` assignment.
757
+ *
758
+ * Base implementation uses MySQL-compatible syntax. Override in dialect subclasses.
759
+ */
760
+ formatJsonMerge(ctx, escapedCol, value) {
761
+ let expr = escapedCol;
762
+ if (hasKeys(value.$merge)) {
763
+ expr = `JSON_MERGE_PATCH(COALESCE(${escapedCol}, '{}'), ?)`;
764
+ ctx.pushValue(JSON.stringify(value.$merge));
765
+ }
766
+ if (value.$unset?.length) {
767
+ for (const key of value.$unset) {
768
+ expr = `JSON_REMOVE(${expr}, '$.${this.escapeJsonKey(key)}')`;
769
+ }
770
+ }
771
+ ctx.append(`${escapedCol} = ${expr}`);
772
+ }
773
+ /**
774
+ * Checks if a value is a `$merge`/`$unset` operator object.
775
+ */
776
+ isJsonMergeOp(value) {
777
+ return typeof value === 'object' && value !== null && ('$merge' in value || '$unset' in value);
778
+ }
779
+ /** Escapes a JSON key for safe interpolation into SQL string literals. */
780
+ escapeJsonKey(key) {
781
+ return key.replace(/'/g, "''");
782
+ }
783
+ getRawValue(ctx, opts) {
784
+ const { value, prefix = '', escapedPrefix, autoPrefixAlias } = opts;
785
+ const rawValue = value[RAW_VALUE];
786
+ if (typeof rawValue === 'function') {
787
+ const res = rawValue({
788
+ ...opts,
789
+ ctx,
790
+ dialect: this,
791
+ prefix,
792
+ escapedPrefix: escapedPrefix ?? this.escapeId(prefix, true, true),
793
+ });
794
+ if (typeof res === 'string' || (typeof res === 'number' && !Number.isNaN(res))) {
795
+ ctx.append(String(res));
796
+ }
797
+ }
798
+ else {
799
+ ctx.append(prefix + String(rawValue));
800
+ }
801
+ const alias = value[RAW_ALIAS];
802
+ if (alias) {
803
+ const fullAlias = autoPrefixAlias ? prefix + alias : alias;
804
+ // Replace dots with underscores for alias to avoid syntax errors
805
+ const safeAlias = fullAlias.replace(/\./g, '_');
806
+ const escapedFullAlias = this.escapeId(safeAlias, true);
807
+ ctx.append(' ' + escapedFullAlias);
808
+ }
809
+ }
810
+ /**
811
+ * Resolves a dot-notation key to its JSON field metadata.
812
+ * Shared by `where()` and `sort()` to detect 'column.path' keys where 'column' is a JSON/JSONB field.
813
+ *
814
+ * @returns resolved metadata or `undefined` if the key is not a JSON dot-notation path
815
+ */
816
+ resolveJsonDotPath(meta, key, prefix) {
817
+ const dotIndex = key.indexOf('.');
818
+ if (dotIndex <= 0) {
819
+ return undefined;
820
+ }
821
+ const root = key.slice(0, dotIndex);
822
+ const field = meta.fields[root];
823
+ if (!field || !isJsonType(field.type)) {
824
+ return undefined;
825
+ }
826
+ const jsonPath = key.slice(dotIndex + 1);
827
+ const colName = this.resolveColumnName(root, field);
828
+ const escapedCol = (prefix ? this.escapeId(prefix, true, true) : '') + this.escapeId(colName);
829
+ const config = this.getJsonFieldConfig(escapedCol, jsonPath);
830
+ return { root, jsonPath, config };
831
+ }
832
+ /**
833
+ * Compare a JSONB dot-notation path, e.g. `'settings.isArchived': { $ne: true }`.
834
+ * Receives a pre-resolved `resolveJsonDotPath` result to avoid redundant computation.
835
+ */
836
+ compareJsonPath(ctx, resolved, val) {
837
+ const { jsonPath, config } = resolved;
838
+ const value = this.normalizeWhereValue(val);
839
+ const operators = getKeys(value);
840
+ if (operators.length > 1) {
841
+ ctx.append('(');
842
+ }
843
+ operators.forEach((op, index) => {
844
+ if (index > 0)
845
+ ctx.append(' AND ');
846
+ ctx.append(this.buildJsonFieldCondition(ctx, config, jsonPath, op, value[op]));
847
+ });
848
+ if (operators.length > 1) {
849
+ ctx.append(')');
850
+ }
851
+ }
852
+ /**
853
+ * Returns a dialect-specific `JsonFieldConfig` for accessing a nested JSON path.
854
+ * Dialects should override this to provide their specific JSON accessor syntax.
855
+ *
856
+ * @param escapedColumn - The escaped column name (possibly prefixed with table name)
857
+ * @param jsonPath - The dot-separated path within the JSON field (e.g. 'isArchived' or 'theme.color')
858
+ */
859
+ getJsonFieldConfig(escapedColumn, jsonPath) {
860
+ return {
861
+ ...this.getBaseJsonConfig(),
862
+ fieldAccessor: () => {
863
+ const segments = jsonPath.split('.');
864
+ let expr = escapedColumn;
865
+ for (let i = 0; i < segments.length; i++) {
866
+ const op = i === segments.length - 1 ? '->>' : '->';
867
+ expr = `(${expr}${op}'${this.escapeJsonKey(segments[i])}')`;
868
+ }
869
+ return expr;
870
+ },
871
+ };
872
+ }
873
+ /**
874
+ * Returns the dialect-invariant portion of `JsonFieldConfig`.
875
+ * Dialects override this to provide casts, operators, and value binding.
876
+ * Both `getJsonFieldConfig` (dot-notation) and `buildJsonFieldOperator` ($elemMatch) compose with this.
877
+ */
878
+ getBaseJsonConfig() {
879
+ return {
880
+ numericCast: (expr) => `CAST(${expr} AS NUMERIC)`,
881
+ likeFn: 'LIKE',
882
+ ilikeExpr: (f, ph) => `LOWER(${f}) LIKE ${ph}`,
883
+ regexpOp: 'REGEXP',
884
+ addValue: (c, v) => {
885
+ c.pushValue(v);
886
+ return '?';
887
+ },
888
+ };
889
+ }
890
+ /**
891
+ * Normalizes a raw WHERE value into an operator map.
892
+ * Arrays become `$in`, scalars/null become `$eq`, objects pass through.
893
+ */
894
+ normalizeWhereValue(val) {
895
+ if (Array.isArray(val))
896
+ return { $in: val };
897
+ if (typeof val === 'object' && val !== null)
898
+ return val;
899
+ return { $eq: val };
900
+ }
901
+ /**
902
+ * Filter by ManyToMany or OneToMany relation using an EXISTS subquery.
903
+ * Generates: `EXISTS (SELECT 1 FROM ... WHERE local_fk = parent.id AND ...)`
904
+ */
905
+ compareRelation(ctx, entity, key, val, rel, opts) {
906
+ const meta = getMeta(entity);
907
+ const parentTable = this.resolveTableName(entity, meta);
908
+ const parentId = meta.id;
909
+ const escapedParentId = (opts.prefix ? this.escapeId(opts.prefix, true, true) : this.escapeId(parentTable, false, true)) +
910
+ this.escapeId(parentId);
911
+ if (!rel.references?.length) {
912
+ throw new TypeError(`Relation '${key}' on '${parentTable}' has no references defined`);
913
+ }
914
+ const relatedEntity = rel.entity();
915
+ const relatedMeta = getMeta(relatedEntity);
916
+ const relatedTable = this.resolveTableName(relatedEntity, relatedMeta);
917
+ ctx.append('EXISTS (SELECT 1 FROM ');
918
+ if (rel.cardinality === 'mm' && rel.through) {
919
+ // ManyToMany: EXISTS (SELECT 1 FROM JunctionTable WHERE junction.localFk = parent.id AND junction.foreignFk IN (SELECT related.id FROM Related WHERE ...))
920
+ const throughEntity = rel.through();
921
+ const throughMeta = getMeta(throughEntity);
922
+ const throughTable = this.resolveTableName(throughEntity, throughMeta);
923
+ const localFk = rel.references[0].local;
924
+ const foreignFk = rel.references[1].local;
925
+ const relatedId = relatedMeta.id;
926
+ ctx.append(this.escapeId(throughTable));
927
+ ctx.append(` WHERE ${this.escapeId(throughTable, false, true)}${this.escapeId(localFk)} = ${escapedParentId}`);
928
+ ctx.append(` AND ${this.escapeId(throughTable, false, true)}${this.escapeId(foreignFk)} IN (`);
929
+ ctx.append(`SELECT ${this.escapeId(relatedTable, false, true)}${this.escapeId(relatedId)} FROM ${this.escapeId(relatedTable)}`);
930
+ this.where(ctx, relatedEntity, val, {
931
+ prefix: relatedTable,
932
+ clause: 'WHERE',
933
+ softDelete: false,
934
+ });
935
+ ctx.append(')');
936
+ }
937
+ else if (rel.cardinality === '1m') {
938
+ // OneToMany: EXISTS (SELECT 1 FROM Child WHERE child.parentFk = parent.id AND ...)
939
+ const foreignFk = rel.references[0].foreign;
940
+ ctx.append(this.escapeId(relatedTable));
941
+ ctx.append(` WHERE ${this.escapeId(relatedTable, false, true)}${this.escapeId(foreignFk)} = ${escapedParentId}`);
942
+ this.where(ctx, relatedEntity, val, {
943
+ prefix: relatedTable,
944
+ clause: 'AND',
945
+ softDelete: false,
946
+ });
947
+ }
948
+ ctx.append(')');
949
+ }
950
+ }
951
+ /**
952
+ * Type guard: narrows a relation select value to a query object (with optional `$required`).
953
+ */
954
+ function isRelationSelectQuery(val) {
955
+ return val !== null && typeof val === 'object' && !Array.isArray(val);
956
+ }
957
+ //# sourceMappingURL=abstractSqlDialect.js.map