cabloy 5.1.111 → 5.1.112

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 (369) hide show
  1. package/.cabloy-version +1 -1
  2. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +29 -1
  3. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +12 -0
  4. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +3 -0
  5. package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +4 -0
  6. package/.claude/skills/cabloy-master-detail/SKILL.md +13 -2
  7. package/.github/workflows/playwright-e2e.yml +45 -0
  8. package/.gitignore +1 -0
  9. package/CHANGELOG.md +17 -0
  10. package/CLAUDE.md +4 -1
  11. package/README.md +8 -8
  12. package/cabloy-docs/backend/crud-workflow.md +10 -0
  13. package/cabloy-docs/backend/foundation.md +29 -4
  14. package/cabloy-docs/backend/introduction.md +1 -1
  15. package/cabloy-docs/backend/model-guide.md +9 -11
  16. package/cabloy-docs/backend/multi-instance-and-instance-resolution.md +18 -0
  17. package/cabloy-docs/backend/service-guide.md +1 -1
  18. package/cabloy-docs/frontend/a-router-guide.md +1 -1
  19. package/cabloy-docs/frontend/introduction.md +1 -1
  20. package/cabloy-docs/frontend/navigation-guards-guide.md +20 -11
  21. package/cabloy-docs/frontend/route-alias-guide.md +24 -0
  22. package/cabloy-docs/frontend/scripts.md +71 -24
  23. package/cabloy-docs/frontend/ssr-init-data.md +25 -0
  24. package/cabloy-docs/frontend/ssr-review-checklist.md +17 -7
  25. package/cabloy-docs/frontend/use-state-data-best-practices.md +4 -0
  26. package/cabloy-docs/frontend/zova-router-under-the-hood.md +4 -1
  27. package/cabloy-docs/fullstack/comparison-with-other-frameworks.md +19 -13
  28. package/cabloy-docs/fullstack/introduction.md +10 -10
  29. package/cabloy-docs/fullstack/quickstart.md +23 -1
  30. package/cabloy-docs/index.md +14 -14
  31. package/cabloy-docs/reference/package-map.md +11 -7
  32. package/cabloy-docs/reference/repo-scripts.md +108 -23
  33. package/e2e/scripts/e2e.ts +1 -1
  34. package/e2e/specs/a-commerce/commerce.spec.ts +124 -1
  35. package/package.json +2 -1
  36. package/scripts/init.ts +6 -12
  37. package/scripts/upgrade.ts +3 -1
  38. package/vona/packages-vona/vona/package.json +1 -1
  39. package/vona/pnpm-lock.yaml +39 -108
  40. package/vona/src/backend/config/config/config.ts +11 -0
  41. package/vona/src/suite/a-commerce/modules/commerce-catalog/package.json +4 -2
  42. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +732 -2
  43. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/locales.ts +18 -0
  44. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/meta.index.ts +14 -0
  45. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/meta.version.ts +52 -0
  46. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/ssrMenu.category.ts +30 -0
  47. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/ssrMenu.product.ts +30 -0
  48. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/bean/ssrMenu.sku.ts +30 -0
  49. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/en-us.ts +19 -0
  50. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/zh-cn.ts +19 -0
  51. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/controller/category.ts +65 -0
  52. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/controller/product.ts +86 -0
  53. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/controller/sku.ts +65 -0
  54. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categoryCreate.tsx +28 -0
  55. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categorySelectReq.tsx +25 -0
  56. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categorySelectRes.tsx +11 -0
  57. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categorySelectResItem.tsx +39 -0
  58. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categoryUpdate.tsx +28 -0
  59. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/categoryView.tsx +25 -0
  60. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productCreate.tsx +28 -0
  61. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublic.tsx +38 -0
  62. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublicSelectReq.tsx +23 -0
  63. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublicSelectRes.tsx +11 -0
  64. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productPublicSku.tsx +25 -0
  65. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productSelectReq.tsx +25 -0
  66. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productSelectRes.tsx +11 -0
  67. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productSelectResItem.tsx +39 -0
  68. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productUpdate.tsx +28 -0
  69. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/productView.tsx +25 -0
  70. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuCreate.tsx +28 -0
  71. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectReq.tsx +25 -0
  72. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectRes.tsx +11 -0
  73. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +39 -0
  74. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuUpdate.tsx +28 -0
  75. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuView.tsx +25 -0
  76. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/category.tsx +53 -0
  77. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/product.tsx +48 -0
  78. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/sku.tsx +66 -0
  79. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/index.ts +1 -0
  80. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/model/category.ts +15 -0
  81. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/model/product.ts +46 -0
  82. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/model/sku.ts +18 -0
  83. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/category.ts +47 -0
  84. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/product.ts +162 -0
  85. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +76 -0
  86. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/catalog.test.ts +358 -0
  87. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/category.test.ts +91 -0
  88. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/product.test.ts +154 -0
  89. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +190 -0
  90. package/vona/src/suite/a-commerce/modules/commerce-member/package.json +2 -1
  91. package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +342 -5
  92. package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/locales.ts +18 -0
  93. package/vona/src/suite/a-commerce/modules/commerce-member/src/bean/meta.index.ts +12 -0
  94. package/vona/src/suite/a-commerce/modules/commerce-member/src/bean/meta.version.ts +31 -0
  95. package/vona/src/suite/a-commerce/modules/commerce-member/src/config/locale/en-us.ts +12 -0
  96. package/vona/src/suite/a-commerce/modules/commerce-member/src/config/locale/zh-cn.ts +12 -0
  97. package/vona/src/suite/a-commerce/modules/commerce-member/src/controller/address.ts +59 -0
  98. package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressCreate.tsx +39 -0
  99. package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectReq.tsx +30 -0
  100. package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectRes.tsx +11 -0
  101. package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressSelectResItem.tsx +53 -0
  102. package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressUpdate.tsx +39 -0
  103. package/vona/src/suite/a-commerce/modules/commerce-member/src/dto/addressView.tsx +39 -0
  104. package/vona/src/suite/a-commerce/modules/commerce-member/src/entity/address.tsx +76 -0
  105. package/vona/src/suite/a-commerce/modules/commerce-member/src/index.ts +1 -0
  106. package/vona/src/suite/a-commerce/modules/commerce-member/src/model/address.ts +10 -0
  107. package/vona/src/suite/a-commerce/modules/commerce-member/src/service/address.ts +84 -0
  108. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +203 -0
  109. package/vona/src/suite/a-commerce/modules/commerce-seed/package.json +52 -0
  110. package/vona/src/suite/a-commerce/modules/commerce-seed/src/.metadata/index.ts +55 -0
  111. package/vona/src/suite/a-commerce/modules/commerce-seed/src/.metadata/this.ts +2 -0
  112. package/vona/src/suite/a-commerce/modules/commerce-seed/src/bean/meta.version.ts +80 -0
  113. package/vona/src/suite/a-commerce/modules/commerce-seed/src/index.ts +1 -0
  114. package/vona/src/suite/a-commerce/modules/commerce-seed/tsconfig.build.json +11 -0
  115. package/vona/src/suite/a-commerce/modules/commerce-seed/tsconfig.json +7 -0
  116. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/package.json +4 -2
  117. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +192 -2
  118. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/locales.ts +18 -0
  119. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/meta.version.ts +32 -0
  120. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/ssrMenu.home.ts +3 -1
  121. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/ssrMenuGroup.catalog.ts +21 -0
  122. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/bean/ssrMenuGroup.inventory.ts +21 -0
  123. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/en-us.ts +5 -0
  124. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/zh-cn.ts +5 -0
  125. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/controller/operator.ts +21 -0
  126. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/dto/operatorContext.ts +21 -0
  127. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/index.ts +1 -0
  128. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/service/operator.ts +18 -0
  129. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/test/meta.version.test.ts +44 -0
  130. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/test/operatorAccess.test.ts +55 -0
  131. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/test/ssrMenu.test.ts +77 -0
  132. package/vona/src/suite/a-commerce/modules/commerce-trade/package.json +2 -1
  133. package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +773 -2
  134. package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/locales.ts +18 -0
  135. package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/meta.index.ts +23 -0
  136. package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/meta.version.ts +79 -0
  137. package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/ssrMenu.stockAudit.ts +30 -0
  138. package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/ssrMenu.stockBalance.ts +30 -0
  139. package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +25 -0
  140. package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +25 -0
  141. package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/cart.ts +48 -0
  142. package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/stockAudit.ts +38 -0
  143. package/vona/src/suite/a-commerce/modules/commerce-trade/src/controller/stockBalance.ts +49 -0
  144. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartAddItem.tsx +19 -0
  145. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartItem.tsx +34 -0
  146. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartUpdateItem.tsx +15 -0
  147. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartView.tsx +18 -0
  148. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAdjust.tsx +32 -0
  149. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditCreate.tsx +28 -0
  150. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectReq.tsx +28 -0
  151. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectRes.tsx +11 -0
  152. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectResItem.tsx +33 -0
  153. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditUpdate.tsx +28 -0
  154. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditView.tsx +25 -0
  155. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceCreate.tsx +28 -0
  156. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectReq.tsx +28 -0
  157. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectRes.tsx +11 -0
  158. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectResItem.tsx +33 -0
  159. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceUpdate.tsx +28 -0
  160. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceView.tsx +25 -0
  161. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/cart.tsx +24 -0
  162. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/cartItem.tsx +30 -0
  163. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockAudit.tsx +86 -0
  164. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockBalance.tsx +53 -0
  165. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockReservation.tsx +63 -0
  166. package/vona/src/suite/a-commerce/modules/commerce-trade/src/index.ts +1 -0
  167. package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/cart.ts +17 -0
  168. package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/cartItem.ts +10 -0
  169. package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/stockAudit.ts +10 -0
  170. package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/stockBalance.ts +15 -0
  171. package/vona/src/suite/a-commerce/modules/commerce-trade/src/model/stockReservation.ts +10 -0
  172. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/cart.ts +152 -0
  173. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockAudit.ts +20 -0
  174. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +305 -0
  175. package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +174 -0
  176. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockAudit.test.ts +37 -0
  177. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +186 -0
  178. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockReservation.test.ts +262 -0
  179. package/vona/src/suite/a-commerce/package.json +1 -0
  180. package/vona/src/suite/a-commerce/tsconfig.json +3 -0
  181. package/vona/src/suite/a-home/modules/home-user/src/.metadata/index.ts +7 -1
  182. package/vona/src/suite/a-home/modules/home-user/test/role.test.ts +14 -23
  183. package/vona/src/suite/a-training/modules/training-record/src/.metadata/index.ts +10 -8
  184. package/vona/src/suite/a-training/modules/training-recordsubject/src/.metadata/index.ts +2 -0
  185. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +3 -1
  186. package/vona/src/suite-vendor/a-auth/modules/a-auth/package.json +1 -1
  187. package/vona/src/suite-vendor/a-auth/modules/a-auth/src/.metadata/index.ts +7 -3
  188. package/vona/src/suite-vendor/a-auth/modules/auth-simple/package.json +1 -1
  189. package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/.metadata/index.ts +2 -0
  190. package/vona/src/suite-vendor/a-auth/package.json +1 -1
  191. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/package.json +1 -1
  192. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/src/.metadata/index.ts +1 -1
  193. package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/package.json +1 -1
  194. package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/src/.metadata/index.ts +3 -1
  195. package/vona/src/suite-vendor/a-cabloy/modules/a-socket/package.json +1 -1
  196. package/vona/src/suite-vendor/a-cabloy/modules/a-socket/src/.metadata/index.ts +1 -1
  197. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  198. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/.metadata/index.ts +47 -47
  199. package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/package.json +1 -1
  200. package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/src/.metadata/index.ts +1 -1
  201. package/vona/src/suite-vendor/a-cabloy/modules/a-status/package.json +1 -1
  202. package/vona/src/suite-vendor/a-cabloy/modules/a-status/src/.metadata/index.ts +2 -0
  203. package/vona/src/suite-vendor/a-cabloy/package.json +1 -1
  204. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/package.json +1 -1
  205. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/src/.metadata/index.ts +1 -1
  206. package/vona/src/suite-vendor/a-captcha/package.json +1 -1
  207. package/vona/src/suite-vendor/a-file/modules/a-file/package.json +1 -1
  208. package/vona/src/suite-vendor/a-file/modules/a-file/src/.metadata/index.ts +42 -38
  209. package/vona/src/suite-vendor/a-file/package.json +2 -2
  210. package/vona/src/suite-vendor/a-image/modules/a-image/package.json +1 -1
  211. package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/index.ts +42 -38
  212. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/package.json +1 -1
  213. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/.metadata/index.ts +42 -27
  214. package/vona/src/suite-vendor/a-image/package.json +1 -1
  215. package/vona/src/suite-vendor/a-paypal/modules/a-paypal/package.json +1 -1
  216. package/vona/src/suite-vendor/a-paypal/modules/a-paypal/src/.metadata/index.ts +3 -1
  217. package/vona/src/suite-vendor/a-paypal/package.json +1 -1
  218. package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/package.json +1 -1
  219. package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/src/.metadata/index.ts +1 -1
  220. package/vona/src/suite-vendor/a-vona/modules/a-body/package.json +1 -1
  221. package/vona/src/suite-vendor/a-vona/modules/a-body/src/.metadata/index.ts +2 -2
  222. package/vona/src/suite-vendor/a-vona/modules/a-cache/package.json +1 -1
  223. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/.metadata/index.ts +1 -1
  224. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
  225. package/vona/src/suite-vendor/a-vona/modules/a-core/src/.metadata/index.ts +1 -1
  226. package/vona/src/suite-vendor/a-vona/modules/a-error/package.json +1 -1
  227. package/vona/src/suite-vendor/a-vona/modules/a-error/src/.metadata/index.ts +1 -1
  228. package/vona/src/suite-vendor/a-vona/modules/a-event/package.json +1 -1
  229. package/vona/src/suite-vendor/a-vona/modules/a-event/src/.metadata/index.ts +1 -1
  230. package/vona/src/suite-vendor/a-vona/modules/a-executor/package.json +1 -1
  231. package/vona/src/suite-vendor/a-vona/modules/a-executor/src/.metadata/index.ts +1 -1
  232. package/vona/src/suite-vendor/a-vona/modules/a-hmr/package.json +1 -1
  233. package/vona/src/suite-vendor/a-vona/modules/a-hmr/src/.metadata/index.ts +1 -1
  234. package/vona/src/suite-vendor/a-vona/modules/a-instance/package.json +1 -1
  235. package/vona/src/suite-vendor/a-vona/modules/a-instance/src/.metadata/index.ts +3 -1
  236. package/vona/src/suite-vendor/a-vona/modules/a-jwt/package.json +1 -1
  237. package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/.metadata/index.ts +1 -1
  238. package/vona/src/suite-vendor/a-vona/modules/a-logger/package.json +1 -1
  239. package/vona/src/suite-vendor/a-vona/modules/a-logger/src/.metadata/index.ts +1 -1
  240. package/vona/src/suite-vendor/a-vona/modules/a-mail/package.json +1 -1
  241. package/vona/src/suite-vendor/a-vona/modules/a-mail/src/.metadata/index.ts +3 -1
  242. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/package.json +1 -1
  243. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/index.ts +1 -1
  244. package/vona/src/suite-vendor/a-vona/modules/a-onion/package.json +1 -1
  245. package/vona/src/suite-vendor/a-vona/modules/a-onion/src/.metadata/index.ts +1 -1
  246. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  247. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/.metadata/index.ts +1 -1
  248. package/vona/src/suite-vendor/a-vona/modules/a-orm/cli/model/metadata/generate.ts +5 -11
  249. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  250. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_cache.ts +52 -0
  251. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/dto/dtoGet.ts +4 -10
  252. package/vona/src/suite-vendor/a-vona/modules/a-redis/package.json +1 -1
  253. package/vona/src/suite-vendor/a-vona/modules/a-redis/src/.metadata/index.ts +1 -1
  254. package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
  255. package/vona/src/suite-vendor/a-vona/modules/a-security/src/.metadata/index.ts +1 -1
  256. package/vona/src/suite-vendor/a-vona/modules/a-serialization/package.json +1 -1
  257. package/vona/src/suite-vendor/a-vona/modules/a-serialization/src/.metadata/index.ts +1 -1
  258. package/vona/src/suite-vendor/a-vona/modules/a-summer/package.json +1 -1
  259. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/.metadata/index.ts +1 -1
  260. package/vona/src/suite-vendor/a-vona/modules/a-user/package.json +1 -1
  261. package/vona/src/suite-vendor/a-vona/modules/a-user/src/.metadata/index.ts +4 -5
  262. package/vona/src/suite-vendor/a-vona/modules/a-validation/package.json +1 -1
  263. package/vona/src/suite-vendor/a-vona/modules/a-validation/src/.metadata/index.ts +1 -1
  264. package/vona/src/suite-vendor/a-vona/modules/a-version/package.json +1 -1
  265. package/vona/src/suite-vendor/a-vona/modules/a-version/src/.metadata/index.ts +6 -0
  266. package/vona/src/suite-vendor/a-vona/modules/a-web/package.json +1 -1
  267. package/vona/src/suite-vendor/a-vona/modules/a-web/src/.metadata/index.ts +1 -1
  268. package/vona/src/suite-vendor/a-vona/modules/a-worker/package.json +1 -1
  269. package/vona/src/suite-vendor/a-vona/modules/a-worker/src/.metadata/index.ts +1 -1
  270. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  271. package/zova/packages-cli/cli/package.json +2 -2
  272. package/zova/packages-cli/cli-set-front/package.json +1 -1
  273. package/zova/packages-cli/cli-set-front/src/lib/bean/toolsMetadata/generateScope.ts +1 -1
  274. package/zova/packages-zova/zova/package.json +2 -2
  275. package/zova/pnpm-lock.yaml +9 -9
  276. package/zova/src/front/config/config/config.cabloyCommerce.ts +5 -1
  277. package/zova/src/front/config/config/config.cabloyCommerceAdmin.ts +2 -1
  278. package/zova/src/suite/a-commerce/modules/commerce-catalog/cli/openapi.config.ts +9 -0
  279. package/zova/src/suite/a-commerce/modules/commerce-catalog/package.json +2 -1
  280. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +202 -3
  281. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/locales.ts +7 -0
  282. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/page/catalogue.ts +23 -0
  283. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/page/product.ts +19 -0
  284. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/commerceCatalogProduct.ts +52 -0
  285. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/baseURL.ts +5 -0
  286. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/index.ts +3 -0
  287. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/schemas.ts +412 -0
  288. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/types.ts +7159 -0
  289. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/apiSchema/commerceCatalogProduct.ts +20 -0
  290. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/en-us.ts +8 -0
  291. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/config/locale/zh-cn.ts +8 -0
  292. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/index.ts +1 -0
  293. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/model/catalogue.ts +38 -0
  294. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/page/catalogue/controller.tsx +71 -0
  295. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/page/product/controller.tsx +108 -0
  296. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/routes.ts +19 -0
  297. package/zova/src/suite/a-commerce/modules/commerce-member/cli/openapi.config.ts +9 -0
  298. package/zova/src/suite/a-commerce/modules/commerce-member/package.json +2 -1
  299. package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +182 -3
  300. package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/locales.ts +7 -0
  301. package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/page/address.ts +19 -0
  302. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/commerceMemberAddress.ts +111 -0
  303. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/baseURL.ts +5 -0
  304. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/index.ts +3 -0
  305. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +432 -0
  306. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +7445 -0
  307. package/zova/src/suite/a-commerce/modules/commerce-member/src/apiSchema/commerceMemberAddress.ts +35 -0
  308. package/zova/src/suite/a-commerce/modules/commerce-member/src/config/locale/en-us.ts +17 -0
  309. package/zova/src/suite/a-commerce/modules/commerce-member/src/config/locale/zh-cn.ts +17 -0
  310. package/zova/src/suite/a-commerce/modules/commerce-member/src/index.ts +1 -0
  311. package/zova/src/suite/a-commerce/modules/commerce-member/src/model/address.ts +38 -0
  312. package/zova/src/suite/a-commerce/modules/commerce-member/src/page/address/controller.tsx +194 -0
  313. package/zova/src/suite/a-commerce/modules/commerce-member/src/routes.ts +12 -0
  314. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/cli/openapi.config.ts +9 -0
  315. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/package.json +2 -1
  316. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +175 -3
  317. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/locales.ts +7 -0
  318. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/page/dashboard.ts +9 -0
  319. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/commerceSiteadminOperator.ts +25 -0
  320. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/baseURL.ts +5 -0
  321. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/index.ts +3 -0
  322. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/schemas.ts +304 -0
  323. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/types.ts +5710 -0
  324. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/apiSchema/commerceSiteadminOperator.ts +13 -0
  325. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/en-us.ts +5 -0
  326. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/config/locale/zh-cn.ts +5 -0
  327. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/index.ts +1 -0
  328. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/model/operator.ts +17 -0
  329. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/page/dashboard/controller.tsx +34 -0
  330. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/routes.ts +5 -0
  331. package/zova/src/suite/a-commerce/modules/commerce-trade/cli/openapi.config.ts +15 -0
  332. package/zova/src/suite/a-commerce/modules/commerce-trade/package.json +2 -1
  333. package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +182 -3
  334. package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/locales.ts +7 -0
  335. package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/page/cart.ts +19 -0
  336. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/commerceTradeCart.ts +99 -0
  337. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/baseURL.ts +5 -0
  338. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/index.ts +3 -0
  339. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +446 -0
  340. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +7651 -0
  341. package/zova/src/suite/a-commerce/modules/commerce-trade/src/apiSchema/commerceTradeCart.ts +35 -0
  342. package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +8 -0
  343. package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +8 -0
  344. package/zova/src/suite/a-commerce/modules/commerce-trade/src/index.ts +1 -0
  345. package/zova/src/suite/a-commerce/modules/commerce-trade/src/model/cart.ts +77 -0
  346. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/cart/controller.tsx +108 -0
  347. package/zova/src/suite/a-commerce/modules/commerce-trade/src/routes.ts +12 -0
  348. package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +5 -5
  349. package/zova/src/suite/a-demo/modules/demo-todo/src/.metadata/index.ts +2 -2
  350. package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +18 -10
  351. package/zova/src/suite/a-home/modules/home-indexweb/src/.metadata/index.ts +2 -2
  352. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
  353. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/index.ts +4 -4
  354. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +1 -0
  355. package/zova/src/suite-vendor/a-cabloy/package.json +2 -2
  356. package/zova/src/suite-vendor/a-zova/modules/a-bean/cli/controller/metadata/generateMetaPage.ts +3 -1
  357. package/zova/src/suite-vendor/a-zova/modules/a-bean/package.json +1 -1
  358. package/zova/src/suite-vendor/a-zova/modules/a-fetch/package.json +2 -2
  359. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
  360. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts +3 -1
  361. package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
  362. package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/sys.router.ts +35 -8
  363. package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkeySys.ts +28 -12
  364. package/zova/src/suite-vendor/a-zova/modules/a-router/src/service/routerGuards.ts +6 -8
  365. package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/router.ts +14 -2
  366. package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/utils.ts +4 -1
  367. package/zova/src/suite-vendor/a-zova/package.json +5 -5
  368. package/CLAUDE.local.md +0 -4
  369. /package/e2e/specs/{a-basic → cabloy-basic}/basic.spec.ts +0 -0
@@ -0,0 +1,262 @@
1
+ import type { EntityStockReservation } from 'vona-module-commerce-trade';
2
+
3
+ import { catchError } from '@cabloy/utils';
4
+ import assert from 'node:assert';
5
+ import { describe, it } from 'node:test';
6
+ import { app } from 'vona-mock';
7
+
8
+ async function createSku(suffix: string): Promise<number> {
9
+ const categoryId = await app.bean.executor.performAction('post', '/commerce/catalog/category', {
10
+ body: { name: `reservation-category-${suffix}`, published: true },
11
+ });
12
+ const productId = await app.bean.executor.performAction('post', '/commerce/catalog/product', {
13
+ body: { categoryId, title: `reservation-product-${suffix}`, published: true },
14
+ });
15
+ return await app.bean.executor.performAction('post', '/commerce/catalog/sku', {
16
+ body: {
17
+ productId,
18
+ code: `reservation-sku-${suffix}`,
19
+ priceCents: 100,
20
+ lifecycle: 'active',
21
+ },
22
+ });
23
+ }
24
+
25
+ async function prepareStock(suffix: string, quantity = 3): Promise<number> {
26
+ const skuId = await createSku(suffix);
27
+ await app.scope('commerce-trade').service.stockBalance.adjustStock({
28
+ skuId,
29
+ delta: quantity,
30
+ reason: 'reservation test setup',
31
+ correlationId: `reservation-setup-${suffix}`,
32
+ });
33
+ return skuId;
34
+ }
35
+
36
+ async function reserve(
37
+ skuId: number,
38
+ suffix: string,
39
+ quantity = 2,
40
+ ): Promise<EntityStockReservation> {
41
+ return await app.scope('commerce-trade').service.stockBalance.reserve({
42
+ skuId,
43
+ quantity,
44
+ reason: 'reservation test',
45
+ correlationId: `reservation-${suffix}`,
46
+ });
47
+ }
48
+
49
+ async function assertReservationRejected(skuId: number, suffix: string, expectedCode: number) {
50
+ const [_, err] = await catchError(() => reserve(skuId, suffix));
51
+ assert.equal(err?.code, expectedCode);
52
+ const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
53
+ assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
54
+ assert.equal(await app.scope('commerce-trade').model.stockReservation.get({ skuId }), undefined);
55
+ const audits = await app.scope('commerce-trade').model.stockAudit.select({ where: { skuId } });
56
+ assert.deepEqual(
57
+ audits.map(audit => audit.operation),
58
+ ['adjust'],
59
+ );
60
+ }
61
+
62
+ describe('stockReservation.test.ts', () => {
63
+ it('reserves and consumes stock exactly once with traceable audits', async () => {
64
+ await app.bean.executor.mockCtx(async () => {
65
+ const suffix = `${Date.now()}`;
66
+ await app.bean.passport.signinMock();
67
+ try {
68
+ const skuId = await prepareStock(suffix);
69
+ const reservation = await reserve(skuId, suffix);
70
+ const balanceAfterReserve = await app
71
+ .scope('commerce-trade')
72
+ .model.stockBalance.get({ skuId });
73
+ assert.deepEqual(
74
+ [
75
+ balanceAfterReserve?.onHand,
76
+ balanceAfterReserve?.reserved,
77
+ balanceAfterReserve?.available,
78
+ ],
79
+ [3, 2, 1],
80
+ );
81
+
82
+ const duplicate = await reserve(skuId, suffix);
83
+ assert.equal(duplicate.id, reservation.id);
84
+ const consumed = await app.scope('commerce-trade').service.stockBalance.consume({
85
+ reservationId: reservation.id,
86
+ reason: 'payment success',
87
+ });
88
+ assert.equal(consumed.state, 'consumed');
89
+ const duplicateConsume = await app.scope('commerce-trade').service.stockBalance.consume({
90
+ reservationId: reservation.id,
91
+ reason: 'payment success retry',
92
+ });
93
+ assert.equal(duplicateConsume.state, 'consumed');
94
+
95
+ const balanceAfterConsume = await app
96
+ .scope('commerce-trade')
97
+ .model.stockBalance.get({ skuId });
98
+ assert.deepEqual(
99
+ [
100
+ balanceAfterConsume?.onHand,
101
+ balanceAfterConsume?.reserved,
102
+ balanceAfterConsume?.available,
103
+ ],
104
+ [1, 0, 1],
105
+ );
106
+ const audits = await app
107
+ .scope('commerce-trade')
108
+ .model.stockAudit.select({ where: { skuId } });
109
+ assert.deepEqual(
110
+ audits.map(audit => audit.operation),
111
+ ['adjust', 'reserve', 'consume'],
112
+ );
113
+ assert.equal(audits[1].stockReservationId, reservation.id);
114
+ } finally {
115
+ await app.bean.passport.signout();
116
+ }
117
+ });
118
+ });
119
+
120
+ it('rejects reservations for inactive or unpublished catalog data without writes', async () => {
121
+ await app.bean.executor.mockCtx(async () => {
122
+ const suffix = `${Date.now()}`;
123
+ await app.bean.passport.signinMock();
124
+ try {
125
+ const inactiveSkuId = await prepareStock(`${suffix}-inactive`);
126
+ await app.scope('commerce-catalog').model.sku.updateById(inactiveSkuId, {
127
+ lifecycle: 'inactive',
128
+ });
129
+ await assertReservationRejected(inactiveSkuId, `${suffix}-inactive`, 404);
130
+
131
+ const unpublishedProductSkuId = await prepareStock(`${suffix}-product`);
132
+ const unpublishedProductSku = await app
133
+ .scope('commerce-catalog')
134
+ .model.sku.getById(unpublishedProductSkuId);
135
+ await app
136
+ .scope('commerce-catalog')
137
+ .model.product.updateById(unpublishedProductSku!.productId, { published: false });
138
+ await assertReservationRejected(unpublishedProductSkuId, `${suffix}-product`, 409);
139
+
140
+ const unpublishedCategorySkuId = await prepareStock(`${suffix}-category`);
141
+ const unpublishedCategorySku = await app
142
+ .scope('commerce-catalog')
143
+ .model.sku.getById(unpublishedCategorySkuId);
144
+ const unpublishedCategoryProduct = await app
145
+ .scope('commerce-catalog')
146
+ .model.product.getById(unpublishedCategorySku!.productId);
147
+ await app
148
+ .scope('commerce-catalog')
149
+ .model.category.updateById(unpublishedCategoryProduct!.categoryId, { published: false });
150
+ await assertReservationRejected(unpublishedCategorySkuId, `${suffix}-category`, 409);
151
+ } finally {
152
+ await app.bean.passport.signout();
153
+ }
154
+ });
155
+ });
156
+
157
+ it('releases and restores stock only from legal reservation states', async () => {
158
+ await app.bean.executor.mockCtx(async () => {
159
+ const suffix = `${Date.now()}`;
160
+ await app.bean.passport.signinMock();
161
+ try {
162
+ const skuId = await prepareStock(suffix);
163
+ const releasedReservation = await reserve(skuId, `${suffix}-release`);
164
+ const released = await app.scope('commerce-trade').service.stockBalance.release({
165
+ reservationId: releasedReservation.id,
166
+ reason: 'payment failed',
167
+ });
168
+ assert.equal(released.state, 'released');
169
+ const duplicateRelease = await app.scope('commerce-trade').service.stockBalance.release({
170
+ reservationId: releasedReservation.id,
171
+ reason: 'payment failed retry',
172
+ });
173
+ assert.equal(duplicateRelease.state, 'released');
174
+
175
+ const consumedReservation = await reserve(skuId, `${suffix}-restore`, 1);
176
+ await app.scope('commerce-trade').service.stockBalance.consume({
177
+ reservationId: consumedReservation.id,
178
+ reason: 'payment success',
179
+ });
180
+ const restored = await app.scope('commerce-trade').service.stockBalance.restore({
181
+ reservationId: consumedReservation.id,
182
+ reason: 'refund success',
183
+ });
184
+ assert.equal(restored.state, 'restored');
185
+
186
+ const [_, err] = await catchError(() =>
187
+ app.scope('commerce-trade').service.stockBalance.consume({
188
+ reservationId: releasedReservation.id,
189
+ reason: 'invalid replay',
190
+ }),
191
+ );
192
+ assert.equal(err?.code, 409);
193
+ const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
194
+ assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
195
+ } finally {
196
+ await app.bean.passport.signout();
197
+ }
198
+ });
199
+ });
200
+
201
+ it('allows exactly one competing reservation for the final unit', async () => {
202
+ await app.bean.executor.mockCtx(async () => {
203
+ const suffix = `${Date.now()}`;
204
+ await app.bean.passport.signinMock();
205
+ try {
206
+ const skuId = await prepareStock(suffix, 1);
207
+ const results = await Promise.allSettled([
208
+ reserve(skuId, `${suffix}-first`, 1),
209
+ reserve(skuId, `${suffix}-second`, 1),
210
+ ]);
211
+ assert.equal(results.filter(result => result.status === 'fulfilled').length, 1);
212
+ assert.equal(results.filter(result => result.status === 'rejected').length, 1);
213
+
214
+ const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
215
+ assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [1, 1, 0]);
216
+ const reservations = await app.scope('commerce-trade').model.stockReservation.select({
217
+ where: { skuId },
218
+ });
219
+ const audits = await app
220
+ .scope('commerce-trade')
221
+ .model.stockAudit.select({ where: { skuId } });
222
+ assert.equal(reservations.length, 1);
223
+ assert.deepEqual(
224
+ audits.map(audit => audit.operation),
225
+ ['adjust', 'reserve'],
226
+ );
227
+ } finally {
228
+ await app.bean.passport.signout();
229
+ }
230
+ });
231
+ });
232
+
233
+ it('rolls back reservation and balance when audit persistence fails', async () => {
234
+ await app.bean.executor.mockCtx(async () => {
235
+ const suffix = `${Date.now()}`;
236
+ await app.bean.passport.signinMock();
237
+ try {
238
+ const skuId = await prepareStock(suffix);
239
+ const modelStockAudit = app.scope('commerce-trade').model.stockAudit;
240
+ const insert = modelStockAudit.insert.bind(modelStockAudit);
241
+ (modelStockAudit as any).insert = async () => {
242
+ throw new Error('reservation audit insert failure');
243
+ };
244
+ try {
245
+ const [_, err] = await catchError(() => reserve(skuId, suffix));
246
+ assert.match(err?.message ?? '', /reservation audit insert failure/);
247
+ } finally {
248
+ (modelStockAudit as any).insert = insert;
249
+ }
250
+
251
+ const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
252
+ assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
253
+ assert.equal(
254
+ await app.scope('commerce-trade').model.stockReservation.get({ skuId }),
255
+ undefined,
256
+ );
257
+ } finally {
258
+ await app.bean.passport.signout();
259
+ }
260
+ });
261
+ });
262
+ });
@@ -10,6 +10,7 @@
10
10
  "vona-module-commerce-member": "^5.0.0",
11
11
  "vona-module-commerce-payment": "^5.0.0",
12
12
  "vona-module-commerce-promotion": "^5.0.0",
13
+ "vona-module-commerce-seed": "^5.0.0",
13
14
  "vona-module-commerce-siteadmin": "^5.0.0",
14
15
  "vona-module-commerce-siteweb": "^5.0.0",
15
16
  "vona-module-commerce-trade": "^5.0.0"
@@ -22,6 +22,9 @@
22
22
  },
23
23
  {
24
24
  "path": "modules/commerce-siteadmin/tsconfig.build.json"
25
+ },
26
+ {
27
+ "path": "modules/commerce-seed/tsconfig.build.json"
25
28
  }
26
29
  ],
27
30
  "exclude": ["modules"]
@@ -144,7 +144,7 @@ import { SymbolKeyEntity, SymbolKeyEntityMeta, SymbolKeyModelOptions } from 'von
144
144
  declare module 'vona-module-home-user' {
145
145
  export interface IModelOptionsUser {
146
146
  relations: {
147
- roles: IModelRelationBelongsToMany<'home-user:roleUser', 'home-user:role', false, undefined,undefined,undefined,undefined>;
147
+ roles: IModelRelationBelongsToMany<'home-user:roleUser', 'home-user:role', false, '*',undefined,undefined,undefined>;
148
148
  };
149
149
  }
150
150
  export interface ModelRole {
@@ -152,6 +152,8 @@ declare module 'vona-module-home-user' {
152
152
  [SymbolKeyEntityMeta]: EntityRoleMeta;
153
153
  [SymbolKeyModelOptions]: IModelOptionsRole;
154
154
  get<T extends IModelGetOptions<EntityRole,ModelRole>>(where: TypeModelWhere<EntityRole>, options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T> | undefined>;
155
+ getForUpdate<T extends IModelGetOptions<EntityRole,ModelRole>>(where: TypeModelWhere<EntityRole>, options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T> | undefined>;
156
+ getByIdForUpdate<T extends IModelGetOptions<EntityRole,ModelRole>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T> | undefined>;
155
157
  mget<T extends IModelGetOptions<EntityRole,ModelRole>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityRole, ModelRole, T>[]>;
156
158
  selectAndCount<T extends IModelSelectParams<EntityRole,ModelRole,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityRole, ModelRole, T>>;
157
159
  select<T extends IModelSelectParams<EntityRole,ModelRole,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityRole, ModelRole, T>[]>;
@@ -181,6 +183,8 @@ export interface ModelRoleUser {
181
183
  [SymbolKeyEntityMeta]: EntityRoleUserMeta;
182
184
  [SymbolKeyModelOptions]: IModelOptionsRoleUser;
183
185
  get<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(where: TypeModelWhere<EntityRoleUser>, options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T> | undefined>;
186
+ getForUpdate<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(where: TypeModelWhere<EntityRoleUser>, options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T> | undefined>;
187
+ getByIdForUpdate<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T> | undefined>;
184
188
  mget<T extends IModelGetOptions<EntityRoleUser,ModelRoleUser>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T>[]>;
185
189
  selectAndCount<T extends IModelSelectParams<EntityRoleUser,ModelRoleUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityRoleUser, ModelRoleUser, T>>;
186
190
  select<T extends IModelSelectParams<EntityRoleUser,ModelRoleUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityRoleUser, ModelRoleUser, T>[]>;
@@ -206,6 +210,8 @@ export interface ModelUser {
206
210
  [SymbolKeyEntityMeta]: EntityUserMeta;
207
211
  [SymbolKeyModelOptions]: IModelOptionsUser;
208
212
  get<T extends IModelGetOptions<EntityUser,ModelUser>>(where: TypeModelWhere<EntityUser>, options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T> | undefined>;
213
+ getForUpdate<T extends IModelGetOptions<EntityUser,ModelUser>>(where: TypeModelWhere<EntityUser>, options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T> | undefined>;
214
+ getByIdForUpdate<T extends IModelGetOptions<EntityUser,ModelUser>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T> | undefined>;
209
215
  mget<T extends IModelGetOptions<EntityUser,ModelUser>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityUser, ModelUser, T>[]>;
210
216
  selectAndCount<T extends IModelSelectParams<EntityUser,ModelUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityUser, ModelUser, T>>;
211
217
  select<T extends IModelSelectParams<EntityUser,ModelUser,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityUser, ModelUser, T>[]>;
@@ -9,37 +9,28 @@ describe('role.test.ts', () => {
9
9
  const roleRegisteredUser = await scope.model.role.getByName('registeredUser');
10
10
  assert.equal(roleRegisteredUser?.title, 'Registered User');
11
11
  assert.deepEqual(roleRegisteredUser?.locales, { 'zh-cn': '注册用户' });
12
- assert.deepEqual(roleRegisteredUser?.siteIds, ['web']);
12
+ assert.ok(roleRegisteredUser?.siteIds.includes('web'));
13
13
 
14
14
  const roleSystemAdmin = await scope.model.role.getByName('systemAdmin');
15
15
  assert.equal(roleSystemAdmin?.title, 'System Administrator');
16
16
  assert.deepEqual(roleSystemAdmin?.locales, { 'zh-cn': '系统管理员' });
17
- assert.deepEqual(roleSystemAdmin?.siteIds, ['web', 'admin']);
17
+ assert.ok(roleSystemAdmin?.siteIds.includes('web'));
18
+ assert.ok(roleSystemAdmin?.siteIds.includes('admin'));
18
19
 
19
20
  await app.bean.passport.signinMock();
20
21
  const passport = await app.bean.executor.performAction('get', '/home/user/passport/current');
21
- assert.deepEqual(
22
- passport.roles.map(role => ({
23
- name: role.name,
24
- title: role.title,
25
- locales: role.locales,
26
- siteIds: role.siteIds,
27
- })),
28
- [
29
- {
30
- name: 'registeredUser',
31
- title: 'Registered User',
32
- locales: { 'zh-cn': '注册用户' },
33
- siteIds: ['web'],
34
- },
35
- {
36
- name: 'systemAdmin',
37
- title: 'System Administrator',
38
- locales: { 'zh-cn': '系统管理员' },
39
- siteIds: ['web', 'admin'],
40
- },
41
- ],
22
+ const passportRegisteredUser = passport.roles.find(
23
+ (role: any) => role.name === 'registeredUser',
42
24
  );
25
+ assert.equal(passportRegisteredUser?.title, 'Registered User');
26
+ assert.deepEqual(passportRegisteredUser?.locales, { 'zh-cn': '注册用户' });
27
+ assert.ok(passportRegisteredUser?.siteIds.includes('web'));
28
+
29
+ const passportSystemAdmin = passport.roles.find((role: any) => role.name === 'systemAdmin');
30
+ assert.equal(passportSystemAdmin?.title, 'System Administrator');
31
+ assert.deepEqual(passportSystemAdmin?.locales, { 'zh-cn': '系统管理员' });
32
+ assert.ok(passportSystemAdmin?.siteIds.includes('web'));
33
+ assert.ok(passportSystemAdmin?.siteIds.includes('admin'));
43
34
  });
44
35
  });
45
36
  });
@@ -95,6 +95,8 @@ trainingRecordSubjects: IModelRelationHasMany<'training-recordsubject:subject',
95
95
  [SymbolKeyEntityMeta]: EntityRecordMeta;
96
96
  [SymbolKeyModelOptions]: IModelOptionsRecord;
97
97
  get<T extends IModelGetOptions<EntityRecord,ModelRecord>>(where: TypeModelWhere<EntityRecord>, options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T> | undefined>;
98
+ getForUpdate<T extends IModelGetOptions<EntityRecord,ModelRecord>>(where: TypeModelWhere<EntityRecord>, options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T> | undefined>;
99
+ getByIdForUpdate<T extends IModelGetOptions<EntityRecord,ModelRecord>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T> | undefined>;
98
100
  mget<T extends IModelGetOptions<EntityRecord,ModelRecord>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T>[]>;
99
101
  selectAndCount<T extends IModelSelectParams<EntityRecord,ModelRecord,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityRecord, ModelRecord, T>>;
100
102
  select<T extends IModelSelectParams<EntityRecord,ModelRecord,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityRecord, ModelRecord, T>[]>;
@@ -393,15 +395,15 @@ export * from '../bean/fileScene.dossierFile.ts';
393
395
 
394
396
  import { type IDecoratorFileSceneOptions } from 'vona-module-a-file';
395
397
  declare module 'vona-module-a-file' {
396
-
398
+
397
399
  export interface IFileSceneRecord {
398
400
  'training-record:dossierFile': IDecoratorFileSceneOptions;
399
401
  }
400
402
 
401
-
403
+
402
404
  }
403
405
  declare module 'vona-module-training-record' {
404
-
406
+
405
407
  export interface FileSceneDossierFile {
406
408
  /** @internal */
407
409
  get scope(): ScopeModuleTrainingRecord;
@@ -411,7 +413,7 @@ declare module 'vona-module-training-record' {
411
413
  get $beanFullName(): 'training-record.fileScene.dossierFile';
412
414
  get $onionName(): 'training-record:dossierFile';
413
415
  get $onionOptions(): IDecoratorFileSceneOptions;
414
- }
416
+ }
415
417
  }
416
418
  /** fileScene: end */
417
419
  /** imageScene: begin */
@@ -419,15 +421,15 @@ export * from '../bean/imageScene.sceneImage.ts';
419
421
 
420
422
  import { type IDecoratorImageSceneOptions } from 'vona-module-a-image';
421
423
  declare module 'vona-module-a-image' {
422
-
424
+
423
425
  export interface IImageSceneRecord {
424
426
  'training-record:sceneImage': IDecoratorImageSceneOptions;
425
427
  }
426
428
 
427
-
429
+
428
430
  }
429
431
  declare module 'vona-module-training-record' {
430
-
432
+
431
433
  export interface ImageSceneSceneImage {
432
434
  /** @internal */
433
435
  get scope(): ScopeModuleTrainingRecord;
@@ -437,7 +439,7 @@ declare module 'vona-module-training-record' {
437
439
  get $beanFullName(): 'training-record.imageScene.sceneImage';
438
440
  get $onionName(): 'training-record:sceneImage';
439
441
  get $onionOptions(): IDecoratorImageSceneOptions;
440
- }
442
+ }
441
443
  }
442
444
  /** imageScene: end */
443
445
  /** locale: begin */
@@ -90,6 +90,8 @@ declare module 'vona-module-training-recordsubject' {
90
90
  [SymbolKeyEntityMeta]: EntitySubjectMeta;
91
91
  [SymbolKeyModelOptions]: IModelOptionsSubject;
92
92
  get<T extends IModelGetOptions<EntitySubject,ModelSubject>>(where: TypeModelWhere<EntitySubject>, options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T> | undefined>;
93
+ getForUpdate<T extends IModelGetOptions<EntitySubject,ModelSubject>>(where: TypeModelWhere<EntitySubject>, options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T> | undefined>;
94
+ getByIdForUpdate<T extends IModelGetOptions<EntitySubject,ModelSubject>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T> | undefined>;
93
95
  mget<T extends IModelGetOptions<EntitySubject,ModelSubject>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T>[]>;
94
96
  selectAndCount<T extends IModelSelectParams<EntitySubject,ModelSubject,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntitySubject, ModelSubject, T>>;
95
97
  select<T extends IModelSelectParams<EntitySubject,ModelSubject,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntitySubject, ModelSubject, T>[]>;
@@ -86,7 +86,7 @@ import { SymbolKeyEntity, SymbolKeyEntityMeta, SymbolKeyModelOptions } from 'von
86
86
  declare module 'vona-module-training-student' {
87
87
  export interface IModelOptionsStudent {
88
88
  relations: {
89
- trainingRecords: IModelRelationHasMany<'training-record:record', 'studentId', false, 'id'|'name'|'subjectCount'|'totalScore'|'averageScore'|'trainingTime'|'sceneImageIds'|'description', undefined, undefined, undefined>;
89
+ trainingRecords: IModelRelationHasMany<'training-record:record', 'studentId', false, 'id'|'name'|'subjectCount'|'totalScore'|'averageScore'|'trainingTime'|'sceneImageIds'|'dossierFileIds'|'description', undefined, undefined, undefined>;
90
90
  };
91
91
  }
92
92
  export interface ModelStudent {
@@ -94,6 +94,8 @@ declare module 'vona-module-training-student' {
94
94
  [SymbolKeyEntityMeta]: EntityStudentMeta;
95
95
  [SymbolKeyModelOptions]: IModelOptionsStudent;
96
96
  get<T extends IModelGetOptions<EntityStudent,ModelStudent>>(where: TypeModelWhere<EntityStudent>, options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T> | undefined>;
97
+ getForUpdate<T extends IModelGetOptions<EntityStudent,ModelStudent>>(where: TypeModelWhere<EntityStudent>, options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T> | undefined>;
98
+ getByIdForUpdate<T extends IModelGetOptions<EntityStudent,ModelStudent>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T> | undefined>;
97
99
  mget<T extends IModelGetOptions<EntityStudent,ModelStudent>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T>[]>;
98
100
  selectAndCount<T extends IModelSelectParams<EntityStudent,ModelStudent,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityStudent, ModelStudent, T>>;
99
101
  select<T extends IModelSelectParams<EntityStudent,ModelStudent,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityStudent, ModelStudent, T>[]>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-auth",
3
- "version": "5.1.20",
3
+ "version": "5.1.21",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -115,7 +115,7 @@ import { SymbolKeyEntity, SymbolKeyEntityMeta, SymbolKeyModelOptions } from 'von
115
115
  declare module 'vona-module-a-auth' {
116
116
  export interface IModelOptionsAuth {
117
117
  relations: {
118
- authProvider: IModelRelationBelongsTo<ModelAuth, ModelAuthProvider, false, 'id'|'providerName'|'clientName'>;
118
+ authProvider: IModelRelationBelongsTo<'a-auth:auth', 'a-auth:authProvider', false, 'id'|'providerName'|'clientName'>;
119
119
  };
120
120
  }
121
121
  export interface ModelAuth {
@@ -123,6 +123,8 @@ declare module 'vona-module-a-auth' {
123
123
  [SymbolKeyEntityMeta]: EntityAuthMeta;
124
124
  [SymbolKeyModelOptions]: IModelOptionsAuth;
125
125
  get<T extends IModelGetOptions<EntityAuth,ModelAuth>>(where: TypeModelWhere<EntityAuth>, options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T> | undefined>;
126
+ getForUpdate<T extends IModelGetOptions<EntityAuth,ModelAuth>>(where: TypeModelWhere<EntityAuth>, options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T> | undefined>;
127
+ getByIdForUpdate<T extends IModelGetOptions<EntityAuth,ModelAuth>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T> | undefined>;
126
128
  mget<T extends IModelGetOptions<EntityAuth,ModelAuth>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T>[]>;
127
129
  selectAndCount<T extends IModelSelectParams<EntityAuth,ModelAuth,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityAuth, ModelAuth, T>>;
128
130
  select<T extends IModelSelectParams<EntityAuth,ModelAuth,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityAuth, ModelAuth, T>[]>;
@@ -148,6 +150,8 @@ export interface ModelAuthProvider {
148
150
  [SymbolKeyEntityMeta]: EntityAuthProviderMeta;
149
151
  [SymbolKeyModelOptions]: IModelOptionsAuthProvider;
150
152
  get<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(where: TypeModelWhere<EntityAuthProvider>, options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T> | undefined>;
153
+ getForUpdate<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(where: TypeModelWhere<EntityAuthProvider>, options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T> | undefined>;
154
+ getByIdForUpdate<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T> | undefined>;
151
155
  mget<T extends IModelGetOptions<EntityAuthProvider,ModelAuthProvider>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T>[]>;
152
156
  selectAndCount<T extends IModelSelectParams<EntityAuthProvider,ModelAuthProvider,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityAuthProvider, ModelAuthProvider, T>>;
153
157
  select<T extends IModelSelectParams<EntityAuthProvider,ModelAuthProvider,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityAuthProvider, ModelAuthProvider, T>[]>;
@@ -203,11 +207,11 @@ declare module 'vona-module-a-auth' {
203
207
  /** bean: begin */
204
208
  import type { BeanAuth } from '../bean/bean.auth.ts';
205
209
  import type { BeanAuthProvider } from '../bean/bean.authProvider.ts';
206
- import 'vona';
210
+ import 'vona';
207
211
  declare module 'vona' {
208
212
  export interface IBeanRecordGlobal {
209
213
  'auth': BeanAuth;
210
- 'authProvider': BeanAuthProvider;
214
+ 'authProvider': BeanAuthProvider;
211
215
  }
212
216
  }
213
217
  /** bean: end */
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-auth-simple",
3
- "version": "5.1.13",
3
+ "version": "5.1.14",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -90,6 +90,8 @@ declare module 'vona-module-auth-simple' {
90
90
  [SymbolKeyEntityMeta]: EntityAuthSimpleMeta;
91
91
  [SymbolKeyModelOptions]: IModelOptionsAuthSimple;
92
92
  get<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(where: TypeModelWhere<EntityAuthSimple>, options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T> | undefined>;
93
+ getForUpdate<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(where: TypeModelWhere<EntityAuthSimple>, options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T> | undefined>;
94
+ getByIdForUpdate<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T> | undefined>;
93
95
  mget<T extends IModelGetOptions<EntityAuthSimple,ModelAuthSimple>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T>[]>;
94
96
  selectAndCount<T extends IModelSelectParams<EntityAuthSimple,ModelAuthSimple,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityAuthSimple, ModelAuthSimple, T>>;
95
97
  select<T extends IModelSelectParams<EntityAuthSimple,ModelAuthSimple,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityAuthSimple, ModelAuthSimple, T>[]>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-auth",
3
- "version": "5.1.22",
3
+ "version": "5.1.23",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-datasharding",
3
- "version": "5.1.12",
3
+ "version": "5.1.13",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -43,7 +43,7 @@ declare module 'vona-module-a-datasharding' {
43
43
  /** bean: end */
44
44
  /** bean: begin */
45
45
  import type { BeanDatasharding } from '../bean/bean.datasharding.ts';
46
- import 'vona';
46
+ import 'vona';
47
47
  declare module 'vona' {
48
48
  export interface IBeanRecordGlobal {
49
49
  'datasharding': BeanDatasharding;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-datasource",
3
- "version": "5.1.11",
3
+ "version": "5.1.12",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -90,6 +90,8 @@ declare module 'vona-module-a-datasource' {
90
90
  [SymbolKeyEntityMeta]: EntityDatasourceMeta;
91
91
  [SymbolKeyModelOptions]: IModelOptionsDatasource;
92
92
  get<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(where: TypeModelWhere<EntityDatasource>, options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T> | undefined>;
93
+ getForUpdate<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(where: TypeModelWhere<EntityDatasource>, options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T> | undefined>;
94
+ getByIdForUpdate<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(id: TableIdentity, options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T> | undefined>;
93
95
  mget<T extends IModelGetOptions<EntityDatasource,ModelDatasource>>(ids: TableIdentity[], options?: T): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T>[]>;
94
96
  selectAndCount<T extends IModelSelectParams<EntityDatasource,ModelDatasource,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelSelectAndCount<EntityDatasource, ModelDatasource, T>>;
95
97
  select<T extends IModelSelectParams<EntityDatasource,ModelDatasource,ModelJoins>, ModelJoins extends TypeModelsClassLikeGeneral | undefined = undefined>(params?: T, options?: IModelMethodOptions, modelJoins?: ModelJoins): Promise<TypeModelRelationResult<EntityDatasource, ModelDatasource, T>[]>;
@@ -139,7 +141,7 @@ declare module 'vona-module-a-datasource' {
139
141
  /** bean: end */
140
142
  /** bean: begin */
141
143
  import type { BeanDatasource } from '../bean/bean.datasource.ts';
142
- import 'vona';
144
+ import 'vona';
143
145
  declare module 'vona' {
144
146
  export interface IBeanRecordGlobal {
145
147
  'datasource': BeanDatasource;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-socket",
3
- "version": "5.1.14",
3
+ "version": "5.1.15",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -17,7 +17,7 @@ declare module 'vona-module-a-socket' {
17
17
  /** bean: end */
18
18
  /** bean: begin */
19
19
  import type { BeanSocket } from '../bean/bean.socket.ts';
20
- import 'vona';
20
+ import 'vona';
21
21
  declare module 'vona' {
22
22
  export interface IBeanRecordGlobal {
23
23
  'socket': BeanSocket;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-ssr",
3
- "version": "5.1.26",
3
+ "version": "5.1.27",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [