vona-module-a-orm 5.0.96 → 5.1.2

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 (367) hide show
  1. package/LICENSE +0 -0
  2. package/cli/entity/metadata/generate.ts +2 -1
  3. package/cli/model/metadata/generate.ts +6 -2
  4. package/cli/model/metadata/magic.ts +15 -6
  5. package/dist/.metadata/index.d.ts +1 -0
  6. package/dist/.metadata/index.d.ts.map +1 -0
  7. package/dist/.metadata/locales.d.ts +1 -0
  8. package/dist/.metadata/locales.d.ts.map +1 -0
  9. package/dist/.metadata/this.d.ts +1 -0
  10. package/dist/.metadata/this.d.ts.map +1 -0
  11. package/dist/bean/aopMethod.transaction.d.ts +2 -1
  12. package/dist/bean/aopMethod.transaction.d.ts.map +1 -0
  13. package/dist/bean/bean.database.d.ts +2 -1
  14. package/dist/bean/bean.database.d.ts.map +1 -0
  15. package/dist/bean/bean.databaseDialectBase.d.ts +2 -1
  16. package/dist/bean/bean.databaseDialectBase.d.ts.map +1 -0
  17. package/dist/bean/bean.model/bean.model_cache.d.ts +5 -1
  18. package/dist/bean/bean.model/bean.model_cache.d.ts.map +1 -0
  19. package/dist/bean/bean.model/bean.model_crud.d.ts +1 -0
  20. package/dist/bean/bean.model/bean.model_crud.d.ts.map +1 -0
  21. package/dist/bean/bean.model/bean.model_crud_inner.d.ts +3 -1
  22. package/dist/bean/bean.model/bean.model_crud_inner.d.ts.map +1 -0
  23. package/dist/bean/bean.model/bean.model_crud_table.d.ts +1 -0
  24. package/dist/bean/bean.model/bean.model_crud_table.d.ts.map +1 -0
  25. package/dist/bean/bean.model/bean.model_knex.d.ts +1 -0
  26. package/dist/bean/bean.model/bean.model_knex.d.ts.map +1 -0
  27. package/dist/bean/bean.model/bean.model_meta.d.ts +3 -2
  28. package/dist/bean/bean.model/bean.model_meta.d.ts.map +1 -0
  29. package/dist/bean/bean.model/bean.model_utils.d.ts +5 -3
  30. package/dist/bean/bean.model/bean.model_utils.d.ts.map +1 -0
  31. package/dist/bean/bean.model/bean.model_view.d.ts +1 -0
  32. package/dist/bean/bean.model/bean.model_view.d.ts.map +1 -0
  33. package/dist/bean/bean.model.d.ts +1 -0
  34. package/dist/bean/bean.model.d.ts.map +1 -0
  35. package/dist/bean/bean.modelBase.d.ts +1 -0
  36. package/dist/bean/bean.modelBase.d.ts.map +1 -0
  37. package/dist/bean/broadcast.columnsClear.d.ts +2 -1
  38. package/dist/bean/broadcast.columnsClear.d.ts.map +1 -0
  39. package/dist/bean/event.clientNameReal.d.ts +2 -1
  40. package/dist/bean/event.clientNameReal.d.ts.map +1 -0
  41. package/dist/bean/event.columnsClear.d.ts +2 -1
  42. package/dist/bean/event.columnsClear.d.ts.map +1 -0
  43. package/dist/bean/hmr.entity.d.ts +1 -0
  44. package/dist/bean/hmr.entity.d.ts.map +1 -0
  45. package/dist/bean/hmr.model.d.ts +1 -0
  46. package/dist/bean/hmr.model.d.ts.map +1 -0
  47. package/dist/bean/queue.doubleDelete.d.ts +2 -1
  48. package/dist/bean/queue.doubleDelete.d.ts.map +1 -0
  49. package/dist/bean/schedule.softDeletionPrune.d.ts +1 -0
  50. package/dist/bean/schedule.softDeletionPrune.d.ts.map +1 -0
  51. package/dist/common/buildWhere.d.ts +1 -0
  52. package/dist/common/buildWhere.d.ts.map +1 -0
  53. package/dist/common/checkWhere.d.ts +1 -0
  54. package/dist/common/checkWhere.d.ts.map +1 -0
  55. package/dist/common/index.d.ts +1 -0
  56. package/dist/common/index.d.ts.map +1 -0
  57. package/dist/common/utils.d.ts +2 -1
  58. package/dist/common/utils.d.ts.map +1 -0
  59. package/dist/config/config.d.ts +1 -0
  60. package/dist/config/config.d.ts.map +1 -0
  61. package/dist/config/errors.d.ts +1 -0
  62. package/dist/config/errors.d.ts.map +1 -0
  63. package/dist/config/locale/en-us.d.ts +1 -0
  64. package/dist/config/locale/en-us.d.ts.map +1 -0
  65. package/dist/config/locale/zh-cn.d.ts +1 -0
  66. package/dist/config/locale/zh-cn.d.ts.map +1 -0
  67. package/dist/extend/index.d.ts +1 -0
  68. package/dist/extend/index.d.ts.map +1 -0
  69. package/dist/extend/schemaBuilder.d.ts +1 -0
  70. package/dist/extend/schemaBuilder.d.ts.map +1 -0
  71. package/dist/extend/tableBuilder.d.ts +1 -0
  72. package/dist/extend/tableBuilder.d.ts.map +1 -0
  73. package/dist/index.d.ts +1 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +94 -15
  76. package/dist/index.js.map +1 -0
  77. package/dist/lib/const.d.ts +1 -0
  78. package/dist/lib/const.d.ts.map +1 -0
  79. package/dist/lib/databaseDialect.d.ts +1 -0
  80. package/dist/lib/databaseDialect.d.ts.map +1 -0
  81. package/dist/lib/dto/dto.d.ts +3 -0
  82. package/dist/lib/dto/dto.d.ts.map +1 -0
  83. package/dist/lib/dto/dtoAggregate.d.ts +3 -2
  84. package/dist/lib/dto/dtoAggregate.d.ts.map +1 -0
  85. package/dist/lib/dto/dtoCreate.d.ts +2 -1
  86. package/dist/lib/dto/dtoCreate.d.ts.map +1 -0
  87. package/dist/lib/dto/dtoGet.d.ts +2 -1
  88. package/dist/lib/dto/dtoGet.d.ts.map +1 -0
  89. package/dist/lib/dto/dtoGroup.d.ts +2 -1
  90. package/dist/lib/dto/dtoGroup.d.ts.map +1 -0
  91. package/dist/lib/dto/dtoListAndCount.d.ts +4 -0
  92. package/dist/lib/dto/dtoListAndCount.d.ts.map +1 -0
  93. package/dist/lib/dto/dtoMutate.d.ts +3 -2
  94. package/dist/lib/dto/dtoMutate.d.ts.map +1 -0
  95. package/dist/lib/dto/dtoQuery.d.ts +1 -0
  96. package/dist/lib/dto/dtoQuery.d.ts.map +1 -0
  97. package/dist/lib/dto/dtoQueryPage.d.ts +1 -0
  98. package/dist/lib/dto/dtoQueryPage.d.ts.map +1 -0
  99. package/dist/lib/dto/dtoSelectAndCount.d.ts +2 -1
  100. package/dist/lib/dto/dtoSelectAndCount.d.ts.map +1 -0
  101. package/dist/lib/dto/dtoUpdate.d.ts +2 -1
  102. package/dist/lib/dto/dtoUpdate.d.ts.map +1 -0
  103. package/dist/lib/dto/index.d.ts +1 -0
  104. package/dist/lib/dto/index.d.ts.map +1 -0
  105. package/dist/lib/entity.d.ts +1 -0
  106. package/dist/lib/entity.d.ts.map +1 -0
  107. package/dist/lib/index.d.ts +1 -0
  108. package/dist/lib/index.d.ts.map +1 -0
  109. package/dist/lib/model.d.ts +1 -0
  110. package/dist/lib/model.d.ts.map +1 -0
  111. package/dist/lib/modelCacheBase.d.ts +2 -1
  112. package/dist/lib/modelCacheBase.d.ts.map +1 -0
  113. package/dist/lib/relations.d.ts +5 -4
  114. package/dist/lib/relations.d.ts.map +1 -0
  115. package/dist/lib/relationsDynamic.d.ts +5 -4
  116. package/dist/lib/relationsDynamic.d.ts.map +1 -0
  117. package/dist/lib/relationsMutate.d.ts +4 -3
  118. package/dist/lib/relationsMutate.d.ts.map +1 -0
  119. package/dist/lib/relationsStatic.d.ts +1 -0
  120. package/dist/lib/relationsStatic.d.ts.map +1 -0
  121. package/dist/lib/utils.d.ts +1 -0
  122. package/dist/lib/utils.d.ts.map +1 -0
  123. package/dist/main.d.ts +2 -1
  124. package/dist/main.d.ts.map +1 -0
  125. package/dist/service/cacheEntity_.d.ts +1 -0
  126. package/dist/service/cacheEntity_.d.ts.map +1 -0
  127. package/dist/service/cacheQuery_.d.ts +1 -0
  128. package/dist/service/cacheQuery_.d.ts.map +1 -0
  129. package/dist/service/columnsCache_.d.ts +2 -1
  130. package/dist/service/columnsCache_.d.ts.map +1 -0
  131. package/dist/service/columns_.d.ts +2 -1
  132. package/dist/service/columns_.d.ts.map +1 -0
  133. package/dist/service/database.d.ts +2 -1
  134. package/dist/service/database.d.ts.map +1 -0
  135. package/dist/service/databaseAsyncLocalStorage_.d.ts +1 -0
  136. package/dist/service/databaseAsyncLocalStorage_.d.ts.map +1 -0
  137. package/dist/service/databaseClient_.d.ts +2 -1
  138. package/dist/service/databaseClient_.d.ts.map +1 -0
  139. package/dist/service/db_.d.ts +2 -1
  140. package/dist/service/db_.d.ts.map +1 -0
  141. package/dist/service/entityResolver_.d.ts +1 -0
  142. package/dist/service/entityResolver_.d.ts.map +1 -0
  143. package/dist/service/modelResolver_.d.ts +1 -0
  144. package/dist/service/modelResolver_.d.ts.map +1 -0
  145. package/dist/service/relations_.d.ts +2 -1
  146. package/dist/service/relations_.d.ts.map +1 -0
  147. package/dist/service/transactionAsyncLocalStorage_.d.ts +1 -0
  148. package/dist/service/transactionAsyncLocalStorage_.d.ts.map +1 -0
  149. package/dist/service/transactionConsistency/342/200/214_.d.ts +1 -0
  150. package/dist/service/transactionConsistency/342/200/214_.d.ts.map +1 -0
  151. package/dist/service/transactionFiber_.d.ts +1 -0
  152. package/dist/service/transactionFiber_.d.ts.map +1 -0
  153. package/dist/service/transactionState_.d.ts +2 -1
  154. package/dist/service/transactionState_.d.ts.map +1 -0
  155. package/dist/service/transaction_.d.ts +2 -1
  156. package/dist/service/transaction_.d.ts.map +1 -0
  157. package/dist/types/columns.d.ts +1 -0
  158. package/dist/types/columns.d.ts.map +1 -0
  159. package/dist/types/config.d.ts +1 -0
  160. package/dist/types/config.d.ts.map +1 -0
  161. package/dist/types/database.d.ts +1 -0
  162. package/dist/types/database.d.ts.map +1 -0
  163. package/dist/types/depth.d.ts +1 -0
  164. package/dist/types/depth.d.ts.map +1 -0
  165. package/dist/types/dialect.d.ts +1 -0
  166. package/dist/types/dialect.d.ts.map +1 -0
  167. package/dist/types/dto/dtoAggregate.d.ts +1 -0
  168. package/dist/types/dto/dtoAggregate.d.ts.map +1 -0
  169. package/dist/types/dto/dtoGet.d.ts +3 -2
  170. package/dist/types/dto/dtoGet.d.ts.map +1 -0
  171. package/dist/types/dto/dtoGroup.d.ts +1 -0
  172. package/dist/types/dto/dtoGroup.d.ts.map +1 -0
  173. package/dist/types/dto/dtoListAndCount.d.ts +8 -0
  174. package/dist/types/dto/dtoListAndCount.d.ts.map +1 -0
  175. package/dist/types/dto/dtoMutate.d.ts +8 -9
  176. package/dist/types/dto/dtoMutate.d.ts.map +1 -0
  177. package/dist/types/dto/dtoQueryBase.d.ts +1 -0
  178. package/dist/types/dto/dtoQueryBase.d.ts.map +1 -0
  179. package/dist/types/dto/dtoQueryPageBase.d.ts +1 -0
  180. package/dist/types/dto/dtoQueryPageBase.d.ts.map +1 -0
  181. package/dist/types/dto/dtoSelectAndCount.d.ts +2 -1
  182. package/dist/types/dto/dtoSelectAndCount.d.ts.map +1 -0
  183. package/dist/types/dto/index.d.ts +2 -0
  184. package/dist/types/dto/index.d.ts.map +1 -0
  185. package/dist/types/entity.d.ts +1 -0
  186. package/dist/types/entity.d.ts.map +1 -0
  187. package/dist/types/entityBase.d.ts +1 -0
  188. package/dist/types/entityBase.d.ts.map +1 -0
  189. package/dist/types/entityBaseEmpty.d.ts +1 -0
  190. package/dist/types/entityBaseEmpty.d.ts.map +1 -0
  191. package/dist/types/entityBaseInner.d.ts +1 -0
  192. package/dist/types/entityBaseInner.d.ts.map +1 -0
  193. package/dist/types/entityBaseSimple.d.ts +1 -0
  194. package/dist/types/entityBaseSimple.d.ts.map +1 -0
  195. package/dist/types/extra.d.ts +1 -0
  196. package/dist/types/extra.d.ts.map +1 -0
  197. package/dist/types/index.d.ts +2 -0
  198. package/dist/types/index.d.ts.map +1 -0
  199. package/dist/types/logger.d.ts +1 -0
  200. package/dist/types/logger.d.ts.map +1 -0
  201. package/dist/types/model.d.ts +3 -2
  202. package/dist/types/model.d.ts.map +1 -0
  203. package/dist/types/modelAggr.d.ts +2 -1
  204. package/dist/types/modelAggr.d.ts.map +1 -0
  205. package/dist/types/modelCount.d.ts +2 -1
  206. package/dist/types/modelCount.d.ts.map +1 -0
  207. package/dist/types/modelGeneral.d.ts +4 -3
  208. package/dist/types/modelGeneral.d.ts.map +1 -0
  209. package/dist/types/modelGroup.d.ts +2 -1
  210. package/dist/types/modelGroup.d.ts.map +1 -0
  211. package/dist/types/modelIncrement.d.ts +19 -0
  212. package/dist/types/modelIncrement.d.ts.map +1 -0
  213. package/dist/types/modelWhere.d.ts +2 -1
  214. package/dist/types/modelWhere.d.ts.map +1 -0
  215. package/dist/types/onion/databaseDialect.d.ts +1 -0
  216. package/dist/types/onion/databaseDialect.d.ts.map +1 -0
  217. package/dist/types/onion/entity.d.ts +1 -0
  218. package/dist/types/onion/entity.d.ts.map +1 -0
  219. package/dist/types/onion/index.d.ts +1 -0
  220. package/dist/types/onion/index.d.ts.map +1 -0
  221. package/dist/types/onion/model.d.ts +1 -0
  222. package/dist/types/onion/model.d.ts.map +1 -0
  223. package/dist/types/onion/table.d.ts +1 -0
  224. package/dist/types/onion/table.d.ts.map +1 -0
  225. package/dist/types/relations.d.ts +10 -11
  226. package/dist/types/relations.d.ts.map +1 -0
  227. package/dist/types/relationsAggr.d.ts +2 -1
  228. package/dist/types/relationsAggr.d.ts.map +1 -0
  229. package/dist/types/relationsColumns.d.ts +5 -4
  230. package/dist/types/relationsColumns.d.ts.map +1 -0
  231. package/dist/types/relationsDef.d.ts +5 -4
  232. package/dist/types/relationsDef.d.ts.map +1 -0
  233. package/dist/types/relationsDefDynamic.d.ts +6 -5
  234. package/dist/types/relationsDefDynamic.d.ts.map +1 -0
  235. package/dist/types/relationsDefMutate.d.ts +1 -0
  236. package/dist/types/relationsDefMutate.d.ts.map +1 -0
  237. package/dist/types/relationsGroup.d.ts +1 -0
  238. package/dist/types/relationsGroup.d.ts.map +1 -0
  239. package/dist/types/relationsMutate.d.ts +4 -3
  240. package/dist/types/relationsMutate.d.ts.map +1 -0
  241. package/dist/types/relationsTables.d.ts +1 -0
  242. package/dist/types/relationsTables.d.ts.map +1 -0
  243. package/dist/types/transaction.d.ts +1 -0
  244. package/dist/types/transaction.d.ts.map +1 -0
  245. package/dist-cli/entity/metadata/generate.js +1 -1
  246. package/dist-cli/model/metadata/generate.js +4 -2
  247. package/dist-cli/model/metadata/magic.js +2 -2
  248. package/package.json +40 -36
  249. package/src/.metadata/index.ts +348 -0
  250. package/src/.metadata/locales.ts +13 -0
  251. package/src/.metadata/this.ts +2 -0
  252. package/src/bean/aopMethod.transaction.ts +18 -0
  253. package/src/bean/bean.database.ts +57 -0
  254. package/src/bean/bean.databaseDialectBase.ts +149 -0
  255. package/src/bean/bean.model/bean.model_cache.ts +815 -0
  256. package/src/bean/bean.model/bean.model_crud.ts +46 -0
  257. package/src/bean/bean.model/bean.model_crud_inner.ts +281 -0
  258. package/src/bean/bean.model/bean.model_crud_table.ts +59 -0
  259. package/src/bean/bean.model/bean.model_knex.ts +60 -0
  260. package/src/bean/bean.model/bean.model_meta.ts +204 -0
  261. package/src/bean/bean.model/bean.model_utils.ts +275 -0
  262. package/src/bean/bean.model/bean.model_view.ts +129 -0
  263. package/src/bean/bean.model.ts +8 -0
  264. package/src/bean/bean.modelBase.ts +8 -0
  265. package/src/bean/broadcast.columnsClear.ts +24 -0
  266. package/src/bean/event.clientNameReal.ts +10 -0
  267. package/src/bean/event.columnsClear.ts +13 -0
  268. package/src/bean/hmr.entity.ts +12 -0
  269. package/src/bean/hmr.model.ts +16 -0
  270. package/src/bean/queue.doubleDelete.ts +29 -0
  271. package/src/bean/schedule.softDeletionPrune.ts +45 -0
  272. package/src/common/buildWhere.ts +238 -0
  273. package/src/common/checkWhere.ts +128 -0
  274. package/src/common/index.ts +3 -0
  275. package/src/common/utils.ts +74 -0
  276. package/src/config/config.ts +60 -0
  277. package/src/config/errors.ts +3 -0
  278. package/src/config/locale/en-us.ts +8 -0
  279. package/src/config/locale/zh-cn.ts +8 -0
  280. package/src/extend/index.ts +12 -0
  281. package/src/extend/schemaBuilder.ts +29 -0
  282. package/src/extend/tableBuilder.ts +87 -0
  283. package/src/index.ts +10 -0
  284. package/src/lib/const.ts +58 -0
  285. package/src/lib/databaseDialect.ts +7 -0
  286. package/src/lib/dto/dto.ts +21 -0
  287. package/src/lib/dto/dtoAggregate.ts +51 -0
  288. package/src/lib/dto/dtoCreate.ts +14 -0
  289. package/src/lib/dto/dtoGet.ts +159 -0
  290. package/src/lib/dto/dtoGroup.ts +57 -0
  291. package/src/lib/dto/dtoListAndCount.ts +16 -0
  292. package/src/lib/dto/dtoMutate.ts +82 -0
  293. package/src/lib/dto/dtoQuery.ts +9 -0
  294. package/src/lib/dto/dtoQueryPage.ts +9 -0
  295. package/src/lib/dto/dtoSelectAndCount.ts +20 -0
  296. package/src/lib/dto/dtoUpdate.ts +16 -0
  297. package/src/lib/dto/index.ts +1 -0
  298. package/src/lib/entity.ts +25 -0
  299. package/src/lib/index.ts +9 -0
  300. package/src/lib/model.ts +7 -0
  301. package/src/lib/modelCacheBase.ts +98 -0
  302. package/src/lib/relations.ts +118 -0
  303. package/src/lib/relationsDynamic.ts +75 -0
  304. package/src/lib/relationsMutate.ts +60 -0
  305. package/src/lib/relationsStatic.ts +18 -0
  306. package/src/lib/utils.ts +45 -0
  307. package/src/main.ts +79 -0
  308. package/src/service/cacheEntity_.ts +37 -0
  309. package/src/service/cacheQuery_.ts +20 -0
  310. package/src/service/columnsCache_.ts +69 -0
  311. package/src/service/columns_.ts +64 -0
  312. package/src/service/database.ts +126 -0
  313. package/src/service/databaseAsyncLocalStorage_.ts +29 -0
  314. package/src/service/databaseClient_.ts +124 -0
  315. package/src/service/db_.ts +77 -0
  316. package/src/service/entityResolver_.ts +25 -0
  317. package/src/service/modelResolver_.ts +19 -0
  318. package/src/service/relations_.ts +444 -0
  319. package/src/service/transactionAsyncLocalStorage_.ts +31 -0
  320. package/src/service/transactionConsistency/342/200/214_.ts +37 -0
  321. package/src/service/transactionFiber_.ts +42 -0
  322. package/src/service/transactionState_.ts +35 -0
  323. package/src/service/transaction_.ts +147 -0
  324. package/src/types/columns.ts +8 -0
  325. package/src/types/config.ts +23 -0
  326. package/src/types/database.ts +64 -0
  327. package/src/types/depth.ts +55 -0
  328. package/src/types/dialect.ts +17 -0
  329. package/src/types/dto/dtoAggregate.ts +3 -0
  330. package/src/types/dto/dtoGet.ts +23 -0
  331. package/src/types/dto/dtoGroup.ts +3 -0
  332. package/src/types/dto/dtoListAndCount.ts +7 -0
  333. package/src/types/dto/dtoMutate.ts +231 -0
  334. package/src/types/dto/dtoQueryBase.ts +18 -0
  335. package/src/types/dto/dtoQueryPageBase.ts +18 -0
  336. package/src/types/dto/dtoSelectAndCount.ts +11 -0
  337. package/src/types/dto/index.ts +8 -0
  338. package/src/types/entity.ts +15 -0
  339. package/src/types/entityBase.ts +11 -0
  340. package/src/types/entityBaseEmpty.ts +1 -0
  341. package/src/types/entityBaseInner.ts +18 -0
  342. package/src/types/entityBaseSimple.ts +9 -0
  343. package/src/types/extra.ts +23 -0
  344. package/src/types/index.ts +30 -0
  345. package/src/types/logger.ts +6 -0
  346. package/src/types/model.ts +152 -0
  347. package/src/types/modelAggr.ts +69 -0
  348. package/src/types/modelCount.ts +40 -0
  349. package/src/types/modelGeneral.ts +61 -0
  350. package/src/types/modelGroup.ts +48 -0
  351. package/src/types/modelIncrement.ts +50 -0
  352. package/src/types/modelWhere.ts +85 -0
  353. package/src/types/onion/databaseDialect.ts +22 -0
  354. package/src/types/onion/entity.ts +33 -0
  355. package/src/types/onion/index.ts +4 -0
  356. package/src/types/onion/model.ts +68 -0
  357. package/src/types/onion/table.ts +1 -0
  358. package/src/types/relations.ts +243 -0
  359. package/src/types/relationsAggr.ts +31 -0
  360. package/src/types/relationsColumns.ts +116 -0
  361. package/src/types/relationsDef.ts +152 -0
  362. package/src/types/relationsDefDynamic.ts +128 -0
  363. package/src/types/relationsDefMutate.ts +11 -0
  364. package/src/types/relationsGroup.ts +58 -0
  365. package/src/types/relationsMutate.ts +118 -0
  366. package/src/types/relationsTables.ts +38 -0
  367. package/src/types/transaction.ts +23 -0
@@ -0,0 +1,64 @@
1
+ import { BeanBase } from 'vona';
2
+ import { Service } from 'vona-module-a-bean';
3
+
4
+ import type { ITableColumns, ITableColumnsDefault } from '../types/columns.ts';
5
+ import type { ServiceDb } from './db_.ts';
6
+
7
+ import { ServiceColumnsCache } from './columnsCache_.ts';
8
+
9
+ @Service()
10
+ export class ServiceColumns extends BeanBase {
11
+ private _db: ServiceDb;
12
+ private _serviceColumnsCache: ServiceColumnsCache;
13
+
14
+ protected __init__(db: ServiceDb) {
15
+ this._db = db;
16
+ }
17
+
18
+ private get db() {
19
+ return this._db;
20
+ }
21
+
22
+ private get serviceColumnsCache() {
23
+ if (!this._serviceColumnsCache) {
24
+ const clientNameReal = this.scope.service.database.prepareClientNameReal(this.db.clientName);
25
+ this._serviceColumnsCache = this.bean._getBeanSelector(ServiceColumnsCache, clientNameReal);
26
+ }
27
+ return this._serviceColumnsCache;
28
+ }
29
+
30
+ async columns(tableName?: string): Promise<ITableColumns> {
31
+ if (!tableName) return {};
32
+ let columns = this.serviceColumnsCache.getColumnsCache(tableName);
33
+ if (!columns) {
34
+ const dialect = this.db.dialect;
35
+ const connection = this.db.connection;
36
+ const map = await connection(tableName).columnInfo();
37
+ columns = {};
38
+ for (const name in map) {
39
+ columns[name] = dialect.coerceColumn(map[name]);
40
+ }
41
+ this.serviceColumnsCache.setColumnsCache(tableName, columns);
42
+ }
43
+ return columns;
44
+ }
45
+
46
+ async defaultData(tableName?: string): Promise<ITableColumnsDefault> {
47
+ if (!tableName) return {};
48
+ let data = this.serviceColumnsCache.getColumnsDefaultCache(tableName);
49
+ if (!data) {
50
+ data = {};
51
+ // columns
52
+ const columns = await this.columns(tableName);
53
+ for (const columnName in columns) {
54
+ data[columnName] = columns[columnName].default;
55
+ }
56
+ this.serviceColumnsCache.setColumnsDefaultCache(tableName, data);
57
+ }
58
+ return data;
59
+ }
60
+
61
+ columnsClear(tableName?: string) {
62
+ return this.scope.service.database.columnsClear(this.db.clientName, tableName);
63
+ }
64
+ }
@@ -0,0 +1,126 @@
1
+ import { isNil } from '@cabloy/utils';
2
+ import { appResource, BeanBase, deepExtend } from 'vona';
3
+ import { Service } from 'vona-module-a-bean';
4
+
5
+ import type { BeanDatabaseDialectBase } from '../bean/bean.databaseDialectBase.ts';
6
+ import type { ConfigDatabaseClient } from '../types/config.ts';
7
+ import type { IDatabaseClientDialectRecord, IDatabaseClientRecord, IDbInfo } from '../types/database.ts';
8
+
9
+ import { ServiceDatabaseClient } from './databaseClient_.ts';
10
+
11
+ @Service()
12
+ export class ServiceDatabase extends BeanBase {
13
+ get configDatabase() {
14
+ return this.app.config.database;
15
+ }
16
+
17
+ getClientConfig(clientName: keyof IDatabaseClientRecord, clientConfig?: ConfigDatabaseClient, original?: boolean): ConfigDatabaseClient {
18
+ // clientConfig
19
+ if (!clientConfig) {
20
+ clientConfig = this.configDatabase.clients[clientName];
21
+ }
22
+ // check
23
+ if (!clientConfig) {
24
+ throw new Error(`database config not found: ${clientName}`);
25
+ }
26
+ if (original) return clientConfig;
27
+ // configBaseClient
28
+ const dialect = this.bean.database.getDialect(clientConfig.client);
29
+ // combine
30
+ clientConfig = deepExtend({}, this.configDatabase.base, dialect.configBase, clientConfig);
31
+ // ready
32
+ return clientConfig!;
33
+ }
34
+
35
+ prepareDbInfo(dbInfoOrClientName?: Partial<IDbInfo> | keyof IDatabaseClientRecord): IDbInfo {
36
+ let level;
37
+ let clientName;
38
+ if (typeof dbInfoOrClientName === 'string') {
39
+ level = undefined;
40
+ clientName = dbInfoOrClientName;
41
+ } else {
42
+ level = dbInfoOrClientName?.level;
43
+ clientName = dbInfoOrClientName?.clientName;
44
+ }
45
+ // check if selector
46
+ if (clientName && clientName.includes(':')) return clientName;
47
+ // check if default
48
+ clientName = this.prepareClientName(clientName ?? this.bean.database.current?.clientName);
49
+ // level
50
+ level = level ?? this.bean.database.current?.level ?? 0;
51
+ return { level, clientName };
52
+ }
53
+
54
+ prepareClientNameSelector(dbInfo: IDbInfo, dialect: BeanDatabaseDialectBase | keyof IDatabaseClientDialectRecord) {
55
+ const dialect2 = typeof dialect === 'string' ? this.bean.database.getDialect(dialect) : dialect;
56
+ if (!dialect2.capabilities.level) return dbInfo.clientName;
57
+ // combine
58
+ return dbInfo.level === 0 ? dbInfo.clientName : `${dbInfo.clientName}:${dbInfo.level}`;
59
+ }
60
+
61
+ parseClientNameSelector(clientNameSelector: string): IDbInfo {
62
+ if (isNil(clientNameSelector)) throw new Error('invalid clientNameSelector');
63
+ const [clientName, level] = clientNameSelector.split(':');
64
+ if (!clientName) throw new Error('clientName must be specified');
65
+ return {
66
+ level: Number(level ?? 0),
67
+ clientName: clientName as keyof IDatabaseClientRecord,
68
+ };
69
+ }
70
+
71
+ prepareClientName(clientName?: keyof IDatabaseClientRecord): keyof IDatabaseClientRecord {
72
+ return !clientName || clientName === 'default' ? this.getDefaultClientName() : clientName;
73
+ }
74
+
75
+ getDefaultClientName(): keyof IDatabaseClientRecord {
76
+ const defaultClient = this.app.config.database.defaultClient;
77
+ if (typeof defaultClient === 'function') {
78
+ return defaultClient(this.ctx);
79
+ }
80
+ // check instance
81
+ const instanceName = this.ctx.instanceName;
82
+ if (!isNil(instanceName)) {
83
+ const configInstanceBase = this.$scope.instance.service.instance.getConfigInstanceBase(instanceName);
84
+ if (configInstanceBase?.isolate) {
85
+ return configInstanceBase.isolateClient!;
86
+ }
87
+ }
88
+ return defaultClient;
89
+ }
90
+
91
+ prepareClientNameReal(clientName?: keyof IDatabaseClientRecord): keyof IDatabaseClientRecord {
92
+ return this.scope.event.clientNameReal.emitSync(this.prepareClientName(clientName), clientName => {
93
+ return clientName;
94
+ });
95
+ }
96
+
97
+ columnsClear(clientName?: keyof IDatabaseClientRecord, tableName?: string) {
98
+ this.columnsClearWorker(clientName, tableName);
99
+ this.scope.broadcast.columnsClear.emit({ clientName, tableName });
100
+ }
101
+
102
+ private columnsClearWorker(clientName?: keyof IDatabaseClientRecord, tableName?: string) {
103
+ this.scope.event.columnsClear.emitSync({ clientName: this.prepareClientNameReal(clientName), tableName });
104
+ }
105
+
106
+ async reloadClients(clientName?: keyof IDatabaseClientRecord, clientConfig?: ConfigDatabaseClient) {
107
+ clientName = this.prepareClientName(clientName);
108
+ await this.bean.mutate.reloadInstances(ServiceDatabaseClient, { clientName, clientConfig });
109
+ this.columnsClear(clientName);
110
+ }
111
+
112
+ async reloadClientsWorker(clientName?: keyof IDatabaseClientRecord, clientConfig?: ConfigDatabaseClient) {
113
+ clientName = this.prepareClientName(clientName);
114
+ await this.bean.mutate.reloadInstancesWorker({
115
+ beanFullName: appResource.getBeanFullName(ServiceDatabaseClient) as any,
116
+ data: { clientName, clientConfig },
117
+ });
118
+ this.columnsClearWorker(clientName);
119
+ }
120
+
121
+ async disposeClients(clientName?: keyof IDatabaseClientRecord) {
122
+ clientName = this.prepareClientName(clientName);
123
+ await this.bean.mutate.removeInstances(ServiceDatabaseClient, { clientName });
124
+ this.columnsClear(clientName);
125
+ }
126
+ }
@@ -0,0 +1,29 @@
1
+ import type { FunctionAsync } from 'vona';
2
+
3
+ import { AsyncLocalStorage } from 'node:async_hooks';
4
+ import { BeanBase } from 'vona';
5
+ import { Service } from 'vona-module-a-bean';
6
+
7
+ import { ServiceDb } from '../service/db_.ts';
8
+
9
+ @Service()
10
+ export class ServiceDatabaseAsyncLocalStorage extends BeanBase {
11
+ dbStorage: AsyncLocalStorage<ServiceDb>;
12
+
13
+ protected __init__() {
14
+ this.dbStorage = new AsyncLocalStorage();
15
+ }
16
+
17
+ get current(): ServiceDb {
18
+ return this.dbStorage.getStore()!;
19
+ }
20
+
21
+ async run<RESULT>(store: ServiceDb, fn: FunctionAsync<RESULT>): Promise<RESULT> {
22
+ if (store === this.current) {
23
+ return fn();
24
+ }
25
+ return this.dbStorage.run(store, () => {
26
+ return fn();
27
+ });
28
+ }
29
+ }
@@ -0,0 +1,124 @@
1
+ import type { Knex } from 'knex';
2
+
3
+ import { catchError } from '@cabloy/utils';
4
+ import knex from 'knex';
5
+ import { deepExtend } from 'vona';
6
+ import { Service } from 'vona-module-a-bean';
7
+ import { BeanMutateBase } from 'vona-module-a-beanmutate';
8
+
9
+ import type { ConfigDatabaseClient } from '../types/config.ts';
10
+ import type { IDatabaseClientRecord } from '../types/database.ts';
11
+
12
+ import { ServiceDb } from './db_.ts';
13
+
14
+ export interface IPrepareDatabaseNameResult {
15
+ database?: string;
16
+ filename?: string;
17
+ }
18
+
19
+ @Service()
20
+ export class ServiceDatabaseClient extends BeanMutateBase {
21
+ level: number;
22
+ clientName: keyof IDatabaseClientRecord;
23
+ clientNameSelector: string;
24
+ clientConfig: ConfigDatabaseClient;
25
+ private _knex: Knex;
26
+ private _db: ServiceDb;
27
+
28
+ get configDatabase() {
29
+ return this.app.config.database;
30
+ }
31
+
32
+ get connection(): Knex {
33
+ return this._knex;
34
+ }
35
+
36
+ get db(): ServiceDb {
37
+ return this._db;
38
+ }
39
+
40
+ protected __init__(clientNameSelector?: string, clientConfig?: ConfigDatabaseClient) {
41
+ super.__init__();
42
+ // db
43
+ this._db = this.bean._newBean(ServiceDb, this);
44
+ // load
45
+ this.__load(clientNameSelector!, clientConfig);
46
+ }
47
+
48
+ protected async __dispose__() {
49
+ await super.__dispose__();
50
+ this._db = undefined as any;
51
+ await this.__close();
52
+ }
53
+
54
+ protected async onReloadInstance({ clientName, clientConfig }) {
55
+ if (clientName === this.clientName) {
56
+ await this.reload(clientConfig);
57
+ }
58
+ }
59
+
60
+ protected async onRemoveInstance({ clientName }) {
61
+ if (clientName === this.clientName) {
62
+ await super.onRemoveInstance({ clientName });
63
+ }
64
+ }
65
+
66
+ private __load(clientNameSelector: string, clientConfig?: ConfigDatabaseClient) {
67
+ // name
68
+ this.clientNameSelector = clientNameSelector;
69
+ const dbInfo = this.scope.service.database.parseClientNameSelector(clientNameSelector);
70
+ this.level = dbInfo.level;
71
+ this.clientName = dbInfo.clientName;
72
+ // config: inited by bean.database.getClient
73
+ this.clientConfig = clientConfig!;
74
+ // knex
75
+ this._knex = knex(deepExtend({}, this.clientConfig));
76
+ }
77
+
78
+ private async __close() {
79
+ if (this._knex) {
80
+ await catchError(() => {
81
+ return this._knex.destroy();
82
+ });
83
+ this._knex = undefined as any;
84
+ }
85
+ }
86
+
87
+ async reload(clientConfig?: ConfigDatabaseClient) {
88
+ const clientConfigReal = this.scope.service.database.getClientConfig(this.clientName, clientConfig);
89
+ this.$mutate([this.clientNameSelector, clientConfigReal]);
90
+ await this.__close();
91
+ this.__load(this.clientNameSelector, clientConfigReal);
92
+ }
93
+
94
+ getDatabaseName(): string {
95
+ const connection = this.clientConfig.connection as any;
96
+ return connection.database || connection.filename;
97
+ }
98
+
99
+ private _prepareDatabaseName(databaseName: string): IPrepareDatabaseNameResult {
100
+ const result: IPrepareDatabaseNameResult = {};
101
+ const connection = this.clientConfig.connection as any;
102
+ if (connection.database !== undefined) {
103
+ result.database = databaseName;
104
+ } else if (connection.filename !== undefined) {
105
+ result.filename = databaseName;
106
+ }
107
+ return result;
108
+ }
109
+
110
+ // only used by startup, so no consider that workers broadcast
111
+ async changeConfigConnectionAndReloadWorker(databaseName: string): Promise<void> {
112
+ // set databaseName
113
+ const connDatabaseName = this._prepareDatabaseName(databaseName);
114
+ // set config
115
+ // * should not use this.clientConfig.connection, because password is hidden
116
+ const config = this.scope.service.database.getClientConfig(this.clientName, undefined, true);
117
+ config.connection = Object.assign({}, config.connection, connDatabaseName);
118
+ // only used by startup, so no consider that workers broadcast
119
+ this.configDatabase.clients[this.clientName] = config;
120
+ // reload
121
+ await this.scope.service.database.reloadClientsWorker(this.clientName, config);
122
+ // await this.scope.service.database.reloadClients(this.clientName, config);
123
+ }
124
+ }
@@ -0,0 +1,77 @@
1
+ import type { FunctionAny } from 'vona';
2
+
3
+ import { BeanBase } from 'vona';
4
+ import { Service } from 'vona-module-a-bean';
5
+
6
+ import type { BeanDatabaseDialectBase } from '../bean/bean.databaseDialectBase.ts';
7
+ import type { IDatabaseClientDialectRecord, IDbInfo } from '../types/database.ts';
8
+ import type { ITransactionConsistencyCommitOptions } from '../types/transaction.ts';
9
+ import type { ServiceDatabaseClient } from './databaseClient_.ts';
10
+
11
+ import { ServiceColumns } from './columns_.ts';
12
+ import { ServiceTransaction } from './transaction_.ts';
13
+
14
+ @Service()
15
+ export class ServiceDb extends BeanBase {
16
+ private _client: ServiceDatabaseClient;
17
+ private _columns: ServiceColumns;
18
+ private _transaction: ServiceTransaction;
19
+
20
+ protected __init__(client: ServiceDatabaseClient) {
21
+ this._client = client;
22
+ }
23
+
24
+ get info(): IDbInfo {
25
+ return { level: this.level, clientName: this.clientName };
26
+ }
27
+
28
+ get level() {
29
+ return this._client.level;
30
+ }
31
+
32
+ get clientName() {
33
+ return this._client.clientName;
34
+ }
35
+
36
+ get client() {
37
+ return this._client;
38
+ }
39
+
40
+ get columns() {
41
+ if (!this._columns) {
42
+ this._columns = this.app.bean._newBean(ServiceColumns, this);
43
+ }
44
+ return this._columns;
45
+ }
46
+
47
+ get transaction() {
48
+ if (!this._transaction) {
49
+ this._transaction = this.app.bean._newBean(ServiceTransaction, this);
50
+ }
51
+ return this._transaction;
52
+ }
53
+
54
+ get inTransaction() {
55
+ return this.transaction.inTransaction;
56
+ }
57
+
58
+ get connection() {
59
+ return this.transaction.connection ?? this.client.connection;
60
+ }
61
+
62
+ get dialectName(): keyof IDatabaseClientDialectRecord {
63
+ return this.client.clientConfig.client;
64
+ }
65
+
66
+ get dialect(): BeanDatabaseDialectBase {
67
+ return this.bean.database.getDialect(this.dialectName);
68
+ }
69
+
70
+ async commit(cb: FunctionAny, options?: ITransactionConsistencyCommitOptions) {
71
+ return await this.transaction.commit(cb, options);
72
+ }
73
+
74
+ compensate(cb: FunctionAny) {
75
+ return this.transaction.compensate(cb);
76
+ }
77
+ }
@@ -0,0 +1,25 @@
1
+ import { appResource, BeanBase } from 'vona';
2
+ import { Service } from 'vona-module-a-bean';
3
+ import { $columnsAll } from 'vona-module-a-ormutils';
4
+
5
+ const SymbolModuleScope = Symbol('SymbolModuleScope');
6
+
7
+ @Service()
8
+ export class ServiceEntityResolver extends BeanBase {
9
+ protected [SymbolModuleScope]: string;
10
+ private __instances: Record<string, any> = {};
11
+
12
+ constructor(moduleScope: string) {
13
+ super();
14
+ this[SymbolModuleScope] = moduleScope;
15
+ }
16
+
17
+ protected __get__(prop: string) {
18
+ if (!this.__instances[prop]) {
19
+ const beanFullName = `${this[SymbolModuleScope]}.entity.${prop}`;
20
+ const beanOptions = appResource.getBean(beanFullName)!;
21
+ this.__instances[prop] = $columnsAll(beanOptions.beanClass, true, true);
22
+ }
23
+ return this.__instances[prop];
24
+ }
25
+ }
@@ -0,0 +1,19 @@
1
+ import { BeanBase } from 'vona';
2
+ import { Service } from 'vona-module-a-bean';
3
+
4
+ const SymbolModuleScope = Symbol('SymbolModuleScope');
5
+
6
+ @Service()
7
+ export class ServiceModelResolver extends BeanBase {
8
+ protected [SymbolModuleScope]: string;
9
+
10
+ constructor(moduleScope: string) {
11
+ super();
12
+ this[SymbolModuleScope] = moduleScope;
13
+ }
14
+
15
+ protected __get__(prop: string) {
16
+ const beanFullName = `${this[SymbolModuleScope]}.model.${prop}`;
17
+ return this.bean._getBean(beanFullName as any);
18
+ }
19
+ }