cabloy 5.1.230 → 5.1.232

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 (66) hide show
  1. package/.cabloy-version +1 -1
  2. package/.github/workflows/playwright-e2e.yml +4 -2
  3. package/.github/workflows/vona-test-sqlite3.yml +2 -1
  4. package/CHANGELOG.md +24 -0
  5. package/package.json +1 -1
  6. package/repo-docs/backend/model-guide.md +1 -0
  7. package/repo-docs/backend/websocket-usage-guide.md +3 -0
  8. package/repo-docs/frontend/controller-boundary-guide.md +1 -1
  9. package/repo-docs/frontend/ioc-and-beans.md +2 -1
  10. package/repo-docs/frontend/modules-and-suites.md +1 -0
  11. package/repo-docs/reference/repo-scripts.md +2 -0
  12. package/vona/env/.env +1 -0
  13. package/vona/packages-cli/cli/package.json +1 -1
  14. package/vona/packages-cli/cli-set-api/package.json +1 -1
  15. package/vona/packages-utils/zod-query/package.json +1 -1
  16. package/vona/packages-utils/zod-query/src/lib/query.ts +4 -1
  17. package/vona/packages-vona/vona/package.json +1 -1
  18. package/vona/packages-vona/vona-core/package.json +1 -1
  19. package/vona/packages-vona/vona-core/src/lib/bean/type.ts +3 -3
  20. package/vona/packages-vona/vona-core/src/lib/core/testClaim.test.ts +294 -1
  21. package/vona/packages-vona/vona-core/src/lib/core/testClaim.ts +47 -9
  22. package/vona/packages-vona/vona-core/src/lib/core/testClaimFilesystem.test.ts +163 -39
  23. package/vona/packages-vona/vona-core/src/lib/core/testClaimFilesystemWindows.cs +16 -6
  24. package/vona/packages-vona/vona-core/src/lib/core/testClaimFilesystemWindows.ts +9 -4
  25. package/vona/packages-vona/vona-core/src/lib/utils/index.ts +1 -0
  26. package/vona/packages-vona/vona-core/src/lib/utils/zod-enhance.ts +8 -1
  27. package/vona/packages-vona/vona-mock/package.json +1 -1
  28. package/vona/pnpm-lock.yaml +171 -30
  29. package/vona/pnpm-workspace.yaml +1 -1
  30. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/cartItem.tsx +1 -1
  31. package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +144 -18
  32. package/vona/src/suite-vendor/a-auth/modules/auth-oauth/package.json +1 -1
  33. package/vona/src/suite-vendor/a-auth/modules/auth-oauth/src/bean/authProvider.oauth.ts +1 -0
  34. package/vona/src/suite-vendor/a-auth/modules/auth-oauth/src/types/index.ts +1 -0
  35. package/vona/src/suite-vendor/a-auth/package.json +2 -2
  36. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +1 -1
  37. package/vona/src/suite-vendor/a-cabloy/package.json +2 -2
  38. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
  39. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  40. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  41. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/relationsColumns.ts +7 -5
  42. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  43. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  44. package/zova/packages-utils/zova-jsx/package.json +2 -2
  45. package/zova/packages-zova/zova/package.json +3 -3
  46. package/zova/packages-zova/zova-core/package.json +2 -2
  47. package/zova/packages-zova/zova-core/src/bean/resource/component/type.ts +3 -3
  48. package/zova/packages-zova/zova-core/src/bean/type.ts +6 -6
  49. package/zova/pnpm-lock.yaml +16 -16
  50. package/zova/src/suite/cabloy-basic/modules/basic-button/src/bean/behavior.perform.tsx +5 -5
  51. package/zova/src/suite/cabloy-basic/modules/basic-date/src/.metadata/component/date.ts +3 -1
  52. package/zova/src/suite/cabloy-basic/modules/basic-date/src/.metadata/component/dateRange.ts +12 -4
  53. package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx +8 -2
  54. package/zova/src/suite/cabloy-basic/modules/basic-select/src/.metadata/component/select.ts +9 -3
  55. package/zova/src/suite-vendor/a-zova/modules/a-behavior/package.json +1 -1
  56. package/zova/src/suite-vendor/a-zova/modules/a-behavior/src/types/behavior.ts +3 -3
  57. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
  58. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/detail/detailsActionBulk.ts +5 -3
  59. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/detail/detailsActionRow.ts +5 -3
  60. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/formActionRow.ts +5 -3
  61. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionBulk.ts +5 -3
  62. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionRow.ts +5 -3
  63. package/zova/src/suite-vendor/a-zova/modules/a-zod/package.json +2 -2
  64. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  65. package/zova/src/suite-vendor/a-zova/package.json +5 -5
  66. /package/vona/patches/{zova-core@5.1.93.patch → zova-core@5.1.94.patch} +0 -0
@@ -174,7 +174,7 @@ overrides:
174
174
  zod: npm:@cabloy/zod@4.3.8
175
175
 
176
176
  patchedDependencies:
177
- zova-core@5.1.93: 144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97
177
+ zova-core@5.1.94: 144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97
178
178
 
179
179
  importers:
180
180
 
@@ -737,11 +737,11 @@ importers:
737
737
  specifier: npm:@cabloy/zod@4.3.8
738
738
  version: '@cabloy/zod@4.3.8'
739
739
  zova:
740
- specifier: ^5.1.174
741
- version: 5.1.174(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
740
+ specifier: ^5.1.175
741
+ version: 5.1.175(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
742
742
  zova-jsx:
743
- specifier: ^1.1.93
744
- version: 1.1.93(typescript@5.9.3)
743
+ specifier: ^1.1.94
744
+ version: 1.1.94(typescript@5.9.3)
745
745
  zova-module-a-api:
746
746
  specifier: ^5.1.22
747
747
  version: 5.1.22
@@ -752,8 +752,8 @@ importers:
752
752
  specifier: ^5.1.36
753
753
  version: 5.1.36
754
754
  zova-module-a-behavior:
755
- specifier: ^5.1.26
756
- version: 5.1.26
755
+ specifier: ^5.1.27
756
+ version: 5.1.27
757
757
  zova-module-a-behaviors:
758
758
  specifier: ^5.1.22
759
759
  version: 5.1.22
@@ -785,8 +785,8 @@ importers:
785
785
  specifier: ^5.1.38
786
786
  version: 5.1.38(vue@3.5.43(typescript@5.9.3))
787
787
  zova-module-a-openapi:
788
- specifier: ^5.1.57
789
- version: 5.1.57
788
+ specifier: ^5.1.58
789
+ version: 5.1.58
790
790
  zova-module-a-pay:
791
791
  specifier: ^5.0.9
792
792
  version: 5.0.9
@@ -818,11 +818,11 @@ importers:
818
818
  specifier: ^5.1.44
819
819
  version: 5.1.44(vue@3.5.43(typescript@5.9.3))
820
820
  zova-module-a-zod:
821
- specifier: ^5.1.37
822
- version: 5.1.37
821
+ specifier: ^5.1.38
822
+ version: 5.1.38
823
823
  zova-module-a-zova:
824
- specifier: ^5.1.111
825
- version: 5.1.111(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
824
+ specifier: ^5.1.112
825
+ version: 5.1.112(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
826
826
  zova-module-pay-mock:
827
827
  specifier: ^5.0.5
828
828
  version: 5.0.5
@@ -866,11 +866,11 @@ importers:
866
866
  specifier: npm:@cabloy/zod@4.3.8
867
867
  version: '@cabloy/zod@4.3.8'
868
868
  zova:
869
- specifier: ^5.1.174
870
- version: 5.1.174(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
869
+ specifier: ^5.1.175
870
+ version: 5.1.175(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
871
871
  zova-jsx:
872
- specifier: ^1.1.93
873
- version: 1.1.93(typescript@5.9.3)
872
+ specifier: ^1.1.94
873
+ version: 1.1.94(typescript@5.9.3)
874
874
  zova-module-a-api:
875
875
  specifier: ^5.1.22
876
876
  version: 5.1.22
@@ -881,8 +881,8 @@ importers:
881
881
  specifier: ^5.1.36
882
882
  version: 5.1.36
883
883
  zova-module-a-behavior:
884
- specifier: ^5.1.26
885
- version: 5.1.26
884
+ specifier: ^5.1.27
885
+ version: 5.1.27
886
886
  zova-module-a-behaviors:
887
887
  specifier: ^5.1.22
888
888
  version: 5.1.22
@@ -914,8 +914,8 @@ importers:
914
914
  specifier: ^5.1.38
915
915
  version: 5.1.38(vue@3.5.43(typescript@5.9.3))
916
916
  zova-module-a-openapi:
917
- specifier: ^5.1.57
918
- version: 5.1.57
917
+ specifier: ^5.1.58
918
+ version: 5.1.58
919
919
  zova-module-a-pay:
920
920
  specifier: ^5.0.9
921
921
  version: 5.0.9
@@ -947,11 +947,11 @@ importers:
947
947
  specifier: ^5.1.44
948
948
  version: 5.1.44(vue@3.5.43(typescript@5.9.3))
949
949
  zova-module-a-zod:
950
- specifier: ^5.1.37
951
- version: 5.1.37
950
+ specifier: ^5.1.38
951
+ version: 5.1.38
952
952
  zova-module-a-zova:
953
- specifier: ^5.1.111
954
- version: 5.1.111(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
953
+ specifier: ^5.1.112
954
+ version: 5.1.112(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
955
955
  zova-module-pay-mock:
956
956
  specifier: ^5.0.5
957
957
  version: 5.0.5
@@ -1933,7 +1933,7 @@ importers:
1933
1933
  specifier: workspace:^
1934
1934
  version: link:modules/a-auth
1935
1935
  vona-module-auth-oauth:
1936
- specifier: ^5.0.12
1936
+ specifier: ^5.0.13
1937
1937
  version: link:modules/auth-oauth
1938
1938
  vona-module-auth-simple:
1939
1939
  specifier: workspace:^
@@ -1990,7 +1990,7 @@ importers:
1990
1990
  specifier: ^5.0.3
1991
1991
  version: link:modules/a-markdown
1992
1992
  vona-module-a-rbac:
1993
- specifier: ^5.0.15
1993
+ specifier: ^5.0.16
1994
1994
  version: link:modules/a-rbac
1995
1995
  vona-module-a-socket:
1996
1996
  specifier: workspace:^
@@ -9415,9 +9415,15 @@ packages:
9415
9415
  zova-core@5.1.93:
9416
9416
  resolution: {integrity: sha512-4UukkCdDVSDzX7eLGnu3gfvUVKcE80xZ98/8LmbaIJ0NDz9Chsr2W4Zfz2B+DzvhHSiyOSXMtrlTLbIkieyCMg==}
9417
9417
 
9418
+ zova-core@5.1.94:
9419
+ resolution: {integrity: sha512-puo3pqa4/ngwZj//Md457XMloZ4FRaoJlmwf+zyPyxKL7GoV81BaJeUPi9szzY8aM9EkoWXBhSVA0cp6mTXBhw==}
9420
+
9418
9421
  zova-jsx@1.1.93:
9419
9422
  resolution: {integrity: sha512-DU50tS3v5a2x7PIJak4Qnw8ZL3dFqR25lknqYUE4UDI8vdP8dajlTWOzcSb6+q0xlNaji6detWhZpj1Q+tb37A==}
9420
9423
 
9424
+ zova-jsx@1.1.94:
9425
+ resolution: {integrity: sha512-4QGgNE5J32PXYCgHBt8JBrTRp8CXADgZzIBUsovQmKfIwtMY6DK5+zPQeWBVqHoV5vK95RKhRPwdAKFGOLupeg==}
9426
+
9421
9427
  zova-module-a-api@5.1.22:
9422
9428
  resolution: {integrity: sha512-6KHDm/Kw7dwu3/3R+eM8WR0UBv4b73ksAd9yL44cS7d5KS9o97PD0RDkwep+ziMdod1DvRMHu5QJbvp7DmKIVA==}
9423
9429
 
@@ -9430,6 +9436,9 @@ packages:
9430
9436
  zova-module-a-behavior@5.1.26:
9431
9437
  resolution: {integrity: sha512-gvsonG3yIwH6mcEW/NNyaw9LCJK7WjKAW3pDYkhH+kipOe3TLPgmCQFz2FM0UZIwtopbRsR12exs7Sx26QqnAg==}
9432
9438
 
9439
+ zova-module-a-behavior@5.1.27:
9440
+ resolution: {integrity: sha512-vXvPHGBs7o95Ed7DFVE3wAqdlYwDcrqCtjxXvgcdCrjTjNji3F31IF4UViG48NmExMeAyzC8CqpvG55BE4GI1Q==}
9441
+
9433
9442
  zova-module-a-behaviors@5.1.22:
9434
9443
  resolution: {integrity: sha512-kpi6KB5XvTYTUWOlQHb27e2+l9JdXDlBOXsaP7qFiWog+owOXdc2wrKbLt2vofXPCRkty+rGXBvNqZh6NUixYg==}
9435
9444
 
@@ -9463,6 +9472,9 @@ packages:
9463
9472
  zova-module-a-openapi@5.1.57:
9464
9473
  resolution: {integrity: sha512-U6gKdYXNlD4wn1zgNUC+P3pg6lq23GZNESLipzVe7Zb7buqCXuEBjGdPa2NPrOuLxwWlZNg7Z4Q+GerBEF2geQ==}
9465
9474
 
9475
+ zova-module-a-openapi@5.1.58:
9476
+ resolution: {integrity: sha512-n+L5N9QB/F0P4FuhkDaHm7rHpMpAAc/5W0HEkC2WzCZsTiWBy75dMT8HwvwyXgpoJ4wrz/neoFWo0qKDnelveA==}
9477
+
9466
9478
  zova-module-a-pay@5.0.9:
9467
9479
  resolution: {integrity: sha512-Chl6EKp30HBOGFCJXbla2/lS19WhzQyTZwgYmsL3nnG9Vt2TeUlb82vsYCVuDcy0cgmxVaWjPF7dzKL/r3Pfng==}
9468
9480
 
@@ -9496,9 +9508,15 @@ packages:
9496
9508
  zova-module-a-zod@5.1.37:
9497
9509
  resolution: {integrity: sha512-rXHN9rKbum9w3gDSnC/pIusG2d2FGJOcIauf8jrbT96f+Olk4Q3iV3t2V92mxiLCh9kMvBJPfcOgJFW7pRB5Fw==}
9498
9510
 
9511
+ zova-module-a-zod@5.1.38:
9512
+ resolution: {integrity: sha512-DSAghiWoukNKYPEMLldup4as+xw6XdbpsHtxGKui1IuaaMub42NrPGD9HsHL9EjfzJPAOg1y+St80nhHCigHSA==}
9513
+
9499
9514
  zova-module-a-zova@5.1.111:
9500
9515
  resolution: {integrity: sha512-hJulIPEzWyiKfSClYFVxr3oek49kGOO1Boe2j4Meh9bP7SBHOnvDhbc8FrC9yIM6XhmAiGF39OAbW79ynQowDQ==}
9501
9516
 
9517
+ zova-module-a-zova@5.1.112:
9518
+ resolution: {integrity: sha512-9fIjrumlmSwBetltTTrUpE5Y1veQHE/Yi8BNOGKKGWUkPg/bieUiMv+PcqiDB0LrixeerimOkDDCNSMGyX0nDw==}
9519
+
9502
9520
  zova-module-pay-mock@5.0.5:
9503
9521
  resolution: {integrity: sha512-PFbNz1g2MDVp3NdvKV37WFzHTQ2awSPTD5iexkkOOloAaItmt/KYoV7xadM46wHUCSQZcZQ1SZdgDaUFev+R4Q==}
9504
9522
 
@@ -9514,9 +9532,15 @@ packages:
9514
9532
  zova-suite-a-zova@5.1.173:
9515
9533
  resolution: {integrity: sha512-B+VM8hlw/+rWs5ml2NhrMnzetnNvyp9GXpixlwl+OSY/xvymWLsO2AtANQLchtWgJCNp76NWaArfu4tkgZzrvA==}
9516
9534
 
9535
+ zova-suite-a-zova@5.1.174:
9536
+ resolution: {integrity: sha512-cNbRy63DDb7m7jR8O5mbtfJYD7sFYti6pfJlI7Qe0cvxQcNRu+6LaoxYZqqkFcRN2NpGp+qNxf4IPBOJB7CDvg==}
9537
+
9517
9538
  zova@5.1.174:
9518
9539
  resolution: {integrity: sha512-3HrQpilMfkVuEDw7O/6RV9bB7aPkPLyrVKUYVrJEN/PX/rqg2bW9NRiW1CCzaXAfH4kDymnvYSEjKYLoVKa7rA==}
9519
9540
 
9541
+ zova@5.1.175:
9542
+ resolution: {integrity: sha512-C9xYw09xwpleenULNYfHGTtHa4vYcNjvLJLWzxGevkaAFLQ2WVXJvWIOIzgdV0lIx/h7YGS3WRhpDNwei3zhHA==}
9543
+
9520
9544
  zwitch@1.0.5:
9521
9545
  resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}
9522
9546
 
@@ -15862,7 +15886,38 @@ snapshots:
15862
15886
 
15863
15887
  yocto-queue@0.1.0: {}
15864
15888
 
15865
- zova-core@5.1.93(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3):
15889
+ zova-core@5.1.93(typescript@5.9.3):
15890
+ dependencies:
15891
+ '@cabloy/compose': link:packages-utils/compose
15892
+ '@cabloy/extend': link:packages-utils/extend
15893
+ '@cabloy/json5': link:packages-utils/json5
15894
+ '@cabloy/localeutil': link:packages-utils/localeutil
15895
+ '@cabloy/logger': 1.1.25
15896
+ '@cabloy/module-info': 2.0.3
15897
+ '@cabloy/utils': link:packages-utils/utils
15898
+ '@cabloy/vue-compiler-sfc': 3.5.14
15899
+ '@cabloy/vue-reactivity': 3.5.16
15900
+ '@cabloy/vue-router': 4.4.18(vue@3.5.43(typescript@5.9.3))
15901
+ '@cabloy/vue-runtime-core': 3.5.57
15902
+ '@cabloy/vue-runtime-dom': 3.5.13
15903
+ '@cabloy/vue-server-renderer': 3.5.18(vue@3.5.43(typescript@5.9.3))
15904
+ '@cabloy/word-utils': 2.1.14
15905
+ '@cabloy/zod-errors-custom': link:packages-utils/zod-errors-custom
15906
+ '@cabloy/zod-openapi': link:packages-utils/zod-openapi
15907
+ '@cabloy/zod-query': link:packages-utils/zod-query
15908
+ '@types/js-cookie': 3.0.6
15909
+ '@types/ms': 2.1.0
15910
+ '@vue/shared': 3.5.36
15911
+ deep-equal: 2.2.3
15912
+ ms: 2.1.3
15913
+ reflect-metadata: 0.2.2
15914
+ vue: 3.5.43(typescript@5.9.3)
15915
+ vue-plugin-render-freeze: 2.0.4(vue@3.5.43(typescript@5.9.3))
15916
+ zod: '@cabloy/zod@4.3.8'
15917
+ transitivePeerDependencies:
15918
+ - typescript
15919
+
15920
+ zova-core@5.1.94(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3):
15866
15921
  dependencies:
15867
15922
  '@cabloy/compose': link:packages-utils/compose
15868
15923
  '@cabloy/extend': link:packages-utils/extend
@@ -15900,7 +15955,18 @@ snapshots:
15900
15955
  '@cabloy/word-utils': 2.1.14
15901
15956
  typestyle: 2.4.0
15902
15957
  vue: 3.5.43(typescript@5.9.3)
15903
- zova-core: 5.1.93(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3)
15958
+ zova-core: 5.1.93(typescript@5.9.3)
15959
+ transitivePeerDependencies:
15960
+ - typescript
15961
+
15962
+ zova-jsx@1.1.94(typescript@5.9.3):
15963
+ dependencies:
15964
+ '@cabloy/compose': link:packages-utils/compose
15965
+ '@cabloy/utils': link:packages-utils/utils
15966
+ '@cabloy/word-utils': 2.1.14
15967
+ typestyle: 2.4.0
15968
+ vue: 3.5.43(typescript@5.9.3)
15969
+ zova-core: 5.1.94(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3)
15904
15970
  transitivePeerDependencies:
15905
15971
  - typescript
15906
15972
 
@@ -15914,6 +15980,8 @@ snapshots:
15914
15980
 
15915
15981
  zova-module-a-behavior@5.1.26: {}
15916
15982
 
15983
+ zova-module-a-behavior@5.1.27: {}
15984
+
15917
15985
  zova-module-a-behaviors@5.1.22: {}
15918
15986
 
15919
15987
  zova-module-a-command@5.1.35: {}
@@ -15963,6 +16031,12 @@ snapshots:
15963
16031
  openapi3-ts: 4.6.1
15964
16032
  typestyle: 2.4.0
15965
16033
 
16034
+ zova-module-a-openapi@5.1.58:
16035
+ dependencies:
16036
+ '@cabloy/json-schema-to-zod': 2.6.5
16037
+ openapi3-ts: 4.6.1
16038
+ typestyle: 2.4.0
16039
+
15966
16040
  zova-module-a-pay@5.0.9: {}
15967
16041
 
15968
16042
  zova-module-a-rbac@5.0.1: {}
@@ -16006,6 +16080,13 @@ snapshots:
16006
16080
  '@cabloy/zod-query': link:packages-utils/zod-query
16007
16081
  zod: '@cabloy/zod@4.3.8'
16008
16082
 
16083
+ zova-module-a-zod@5.1.38:
16084
+ dependencies:
16085
+ '@cabloy/zod-errors-custom': link:packages-utils/zod-errors-custom
16086
+ '@cabloy/zod-openapi': link:packages-utils/zod-openapi
16087
+ '@cabloy/zod-query': link:packages-utils/zod-query
16088
+ zod: '@cabloy/zod@4.3.8'
16089
+
16009
16090
  zova-module-a-zova@5.1.111(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3)):
16010
16091
  dependencies:
16011
16092
  '@cabloy/compose': link:packages-utils/compose
@@ -16022,6 +16103,22 @@ snapshots:
16022
16103
  - typescript
16023
16104
  - vue
16024
16105
 
16106
+ zova-module-a-zova@5.1.112(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3)):
16107
+ dependencies:
16108
+ '@cabloy/compose': link:packages-utils/compose
16109
+ '@cabloy/deps': link:packages-utils/deps
16110
+ '@cabloy/json5': link:packages-utils/json5
16111
+ '@cabloy/module-info': 2.0.3
16112
+ '@cabloy/utils': link:packages-utils/utils
16113
+ '@cabloy/vue-router': 4.4.18(vue@3.5.43(typescript@5.9.3))
16114
+ '@cabloy/word-utils': 2.1.14
16115
+ defu: 6.1.7
16116
+ luxon: 3.7.2
16117
+ zova-jsx: 1.1.94(typescript@5.9.3)
16118
+ transitivePeerDependencies:
16119
+ - typescript
16120
+ - vue
16121
+
16025
16122
  zova-module-pay-mock@5.0.5: {}
16026
16123
 
16027
16124
  zova-module-pay-paypal@5.0.2: {}
@@ -16063,9 +16160,42 @@ snapshots:
16063
16160
  - typescript
16064
16161
  - vue
16065
16162
 
16163
+ zova-suite-a-zova@5.1.174(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3)):
16164
+ dependencies:
16165
+ zova-module-a-api: 5.1.22
16166
+ zova-module-a-app: 5.1.26
16167
+ zova-module-a-bean: 5.1.36
16168
+ zova-module-a-behavior: 5.1.27
16169
+ zova-module-a-behaviors: 5.1.22
16170
+ zova-module-a-command: 5.1.35
16171
+ zova-module-a-fetch: 5.1.25(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)
16172
+ zova-module-a-form: 5.1.54(vue@3.5.43(typescript@5.9.3))
16173
+ zova-module-a-icon: 5.1.27
16174
+ zova-module-a-interceptor: 5.1.31
16175
+ zova-module-a-logger: 5.1.28
16176
+ zova-module-a-meta: 5.1.22
16177
+ zova-module-a-model: 5.1.38(vue@3.5.43(typescript@5.9.3))
16178
+ zova-module-a-openapi: 5.1.58
16179
+ zova-module-a-router: 5.1.42
16180
+ zova-module-a-routerstack: 5.1.29
16181
+ zova-module-a-routertabs: 5.1.35
16182
+ zova-module-a-ssr: 5.1.40
16183
+ zova-module-a-ssrhmr: 5.1.23
16184
+ zova-module-a-ssrserver: 5.1.26
16185
+ zova-module-a-style: 5.1.35
16186
+ zova-module-a-table: 5.1.44(vue@3.5.43(typescript@5.9.3))
16187
+ zova-module-a-zod: 5.1.38
16188
+ zova-module-a-zova: 5.1.112(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
16189
+ transitivePeerDependencies:
16190
+ - '@vue/composition-api'
16191
+ - debug
16192
+ - supports-color
16193
+ - typescript
16194
+ - vue
16195
+
16066
16196
  zova@5.1.174(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3)):
16067
16197
  dependencies:
16068
- zova-core: 5.1.93(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3)
16198
+ zova-core: 5.1.93(typescript@5.9.3)
16069
16199
  zova-suite-a-zova: 5.1.173(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
16070
16200
  transitivePeerDependencies:
16071
16201
  - '@vue/composition-api'
@@ -16074,6 +16204,17 @@ snapshots:
16074
16204
  - typescript
16075
16205
  - vue
16076
16206
 
16207
+ zova@5.1.175(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3)):
16208
+ dependencies:
16209
+ zova-core: 5.1.94(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3)
16210
+ zova-suite-a-zova: 5.1.174(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)(vue@3.5.43(typescript@5.9.3))
16211
+ transitivePeerDependencies:
16212
+ - '@vue/composition-api'
16213
+ - debug
16214
+ - supports-color
16215
+ - typescript
16216
+ - vue
16217
+
16077
16218
  zwitch@1.0.5: {}
16078
16219
 
16079
16220
  zwitch@2.0.4: {}
@@ -52,4 +52,4 @@ allowBuilds:
52
52
  vue-demi: true
53
53
 
54
54
  patchedDependencies:
55
- zova-core@5.1.93: patches/zova-core@5.1.93.patch
55
+ zova-core@5.1.94: patches/zova-core@5.1.94.patch
@@ -29,6 +29,6 @@ export class DtoCartItem {
29
29
  @Api.field(v.required(), z.number().int().nonnegative())
30
30
  priceCents: number;
31
31
 
32
- @Api.field(v.required(), z.number().int().positive())
32
+ @Api.field(v.required(), z.number().int().nonnegative())
33
33
  available: number;
34
34
  }
@@ -6,7 +6,10 @@ import { catchError } from '@cabloy/utils';
6
6
  import assert from 'node:assert';
7
7
  import { randomUUID } from 'node:crypto';
8
8
  import { after, before, describe, it } from 'node:test';
9
+ import { appResource } from 'vona';
9
10
  import { acquireTestLock, app } from 'vona-mock';
11
+ import { $schema } from 'vona-module-a-openapiutils';
12
+ import { DtoCartItem, DtoCartView } from 'vona-module-commerce-trade';
10
13
 
11
14
  const actionPath = '/commerce/trade/cart';
12
15
 
@@ -39,22 +42,32 @@ async function performAs<
39
42
 
40
43
  async function registerAndSignin(name: string) {
41
44
  const user = await app.bean.user.register({ name }, true);
42
- const token = await app.bean.passport.signinMock(name as any);
43
- return { token: token.accessToken, user };
45
+ try {
46
+ const token = await app.bean.passport.signinMock(name as any);
47
+ return { token: token.accessToken, user };
48
+ } catch (error) {
49
+ await dropUser(user.id as number);
50
+ throw error;
51
+ }
44
52
  }
45
53
 
46
54
  async function createSellableSku(suffix: string): Promise<ISellableSkuFixture> {
55
+ const fixture: Partial<ISellableSkuFixture> = {};
47
56
  await app.bean.passport.signinMock();
48
57
  try {
49
- const categoryId = await app.bean.executor.performAction('post', '/commerce/catalog/category', {
50
- body: { name: `cart-category-${suffix}`, published: true },
51
- });
52
- const productId = await app.bean.executor.performAction('post', '/commerce/catalog/product', {
53
- body: { categoryId, title: `cart-product-${suffix}`, published: true },
58
+ fixture.categoryId = await app.bean.executor.performAction(
59
+ 'post',
60
+ '/commerce/catalog/category',
61
+ {
62
+ body: { name: `cart-category-${suffix}`, published: true },
63
+ },
64
+ );
65
+ fixture.productId = await app.bean.executor.performAction('post', '/commerce/catalog/product', {
66
+ body: { categoryId: fixture.categoryId, title: `cart-product-${suffix}`, published: true },
54
67
  });
55
- const skuId = await app.bean.executor.performAction('post', '/commerce/catalog/sku', {
68
+ fixture.skuId = await app.bean.executor.performAction('post', '/commerce/catalog/sku', {
56
69
  body: {
57
- productId,
70
+ productId: fixture.productId,
58
71
  code: `cart-sku-${suffix}`,
59
72
  priceCents: 100,
60
73
  lifecycle: 'active',
@@ -62,28 +75,35 @@ async function createSellableSku(suffix: string): Promise<ISellableSkuFixture> {
62
75
  });
63
76
  await app.bean.executor.performAction('post', '/commerce/trade/stockBalance/adjustStock', {
64
77
  body: {
65
- skuId,
78
+ skuId: fixture.skuId,
66
79
  delta: 10,
67
80
  reason: `cart stock ${suffix}`,
68
81
  correlationId: `cart-stock-${suffix}`,
69
82
  },
70
83
  });
71
- return { categoryId, productId, skuId };
84
+ return fixture as ISellableSkuFixture;
85
+ } catch (error) {
86
+ await dropSellableSku(fixture);
87
+ throw error;
72
88
  } finally {
73
89
  await app.bean.passport.signout();
74
90
  }
75
91
  }
76
92
 
77
- async function dropSellableSku(fixture: ISellableSkuFixture | undefined) {
93
+ async function dropSellableSku(fixture: Partial<ISellableSkuFixture> | undefined) {
78
94
  if (!fixture) return;
79
95
  const trade = app.scope('commerce-trade');
80
96
  const catalog = app.scope('commerce-catalog');
81
- await trade.model.stockAudit.delete({ skuId: fixture.skuId });
82
- await trade.model.stockReservation.delete({ skuId: fixture.skuId });
83
- await trade.model.stockBalance.delete({ skuId: fixture.skuId });
84
- await catalog.model.sku.delete({ id: fixture.skuId });
85
- await catalog.model.product.delete({ id: fixture.productId });
86
- await catalog.model.category.delete({ id: fixture.categoryId });
97
+ if (fixture.skuId !== undefined) {
98
+ await trade.model.stockAudit.delete({ skuId: fixture.skuId });
99
+ await trade.model.stockReservation.delete({ skuId: fixture.skuId });
100
+ await trade.model.stockBalance.delete({ skuId: fixture.skuId });
101
+ await catalog.model.sku.delete({ id: fixture.skuId });
102
+ }
103
+ if (fixture.productId !== undefined)
104
+ await catalog.model.product.delete({ id: fixture.productId });
105
+ if (fixture.categoryId !== undefined)
106
+ await catalog.model.category.delete({ id: fixture.categoryId });
87
107
  }
88
108
 
89
109
  async function dropUser(userId: number | undefined) {
@@ -206,6 +226,112 @@ describe('cartOwnership.test.ts', { concurrency: false }, () => {
206
226
  });
207
227
  });
208
228
 
229
+ it('reads an empty cart without creating business records', async () => {
230
+ await app.bean.executor.mockCtx(async () => {
231
+ let customer: Awaited<ReturnType<typeof registerAndSignin>> | undefined;
232
+ try {
233
+ customer = await registerAndSignin(`cart-empty-${createTestId()}`);
234
+ const trade = app.scope('commerce-trade');
235
+ assert.equal(await trade.model.cart.get({ userId: customer.user.id }), undefined);
236
+ assert.deepEqual(await performAs(customer.token, 'get', actionPath), { items: [] });
237
+ assert.deepEqual(await performAs(customer.token, 'get', actionPath), { items: [] });
238
+ assert.equal(await trade.model.cart.get({ userId: customer.user.id }), undefined);
239
+ } finally {
240
+ await app.bean.passport.signout();
241
+ await dropUser(customer?.user.id as number | undefined);
242
+ }
243
+ });
244
+ });
245
+
246
+ it('keeps a sold-out cart DTO-valid without mutating its business records on reads', async () => {
247
+ await app.bean.executor.mockCtx(async () => {
248
+ const suffix = createTestId();
249
+ let sku: ISellableSkuFixture | undefined;
250
+ let customer: Awaited<ReturnType<typeof registerAndSignin>> | undefined;
251
+ try {
252
+ sku = await createSellableSku(suffix);
253
+ customer = await registerAndSignin(`cart-zero-${suffix}`);
254
+ const added = await performAs(customer.token, 'post', `${actionPath}/items`, {
255
+ body: cartItem(sku.skuId),
256
+ });
257
+ await app.bean.executor.newCtxIsolate(async () => {
258
+ await app.bean.passport.signinMock();
259
+ try {
260
+ await app.bean.executor.performAction(
261
+ 'post',
262
+ '/commerce/trade/stockBalance/adjustStock',
263
+ {
264
+ body: {
265
+ skuId: sku!.skuId,
266
+ delta: -10,
267
+ reason: `cart depletion ${suffix}`,
268
+ correlationId: `cart-deplete-${suffix}`,
269
+ },
270
+ innerAccess: false,
271
+ },
272
+ );
273
+ } finally {
274
+ await app.bean.passport.signout();
275
+ }
276
+ });
277
+ const trade = app.scope('commerce-trade');
278
+ const before = {
279
+ cart: await trade.model.cart.getById(added.id),
280
+ items: await trade.model.cartItem.select({ where: { cartId: added.id } }),
281
+ stock: await trade.model.stockBalance.get({ skuId: sku.skuId }),
282
+ };
283
+ assert.equal(before.stock?.available, 0);
284
+ const current = await performAs(customer.token, 'get', actionPath);
285
+ assert.deepEqual(current, {
286
+ id: added.id,
287
+ items: [{ ...added.items[0], available: 0 }],
288
+ });
289
+ assert.deepEqual(await performAs(customer.token, 'get', actionPath), current);
290
+ assert.deepEqual(
291
+ {
292
+ cart: await trade.model.cart.getById(added.id),
293
+ items: await trade.model.cartItem.select({ where: { cartId: added.id } }),
294
+ stock: await trade.model.stockBalance.get({ skuId: sku.skuId }),
295
+ },
296
+ before,
297
+ );
298
+ assert.deepEqual(await $schema(DtoCartView).parseAsync(current), current);
299
+ for (const available of [1, 10]) {
300
+ assert.equal(
301
+ $schema(DtoCartItem).safeParse({ ...current.items[0], available }).success,
302
+ true,
303
+ );
304
+ }
305
+ for (const available of [-1, 0.5]) {
306
+ assert.equal(
307
+ $schema(DtoCartItem).safeParse({ ...current.items[0], available }).success,
308
+ false,
309
+ );
310
+ }
311
+ assert.equal(
312
+ $schema(DtoCartItem).safeParse({ ...current.items[0], available: 1, quantity: 0 })
313
+ .success,
314
+ false,
315
+ );
316
+ const document = await app.bean.openapi.generateJsonOfClasses(
317
+ [DtoCartView, DtoCartItem],
318
+ 'V31',
319
+ );
320
+ const itemSchema = document.components!.schemas![appResource.getBeanFullName(DtoCartItem)!];
321
+ assert.ok('properties' in itemSchema);
322
+ const availableSchema = itemSchema.properties!.available;
323
+ assert.ok('type' in availableSchema);
324
+ assert.equal(availableSchema.type, 'integer');
325
+ assert.equal(availableSchema.minimum, 0);
326
+ assert.equal(availableSchema.exclusiveMinimum, undefined);
327
+ } finally {
328
+ await app.bean.passport.signout();
329
+ await dropUser(customer?.user.id as number | undefined);
330
+ await dropSellableSku(sku);
331
+ }
332
+ });
333
+ });
334
+
209
335
  it('treats another instance cart as absent', async () => {
210
336
  const suffix = createTestId();
211
337
  let itemId!: number;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-auth-oauth",
3
- "version": "5.0.12",
3
+ "version": "5.0.13",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "Vona Module"
@@ -43,6 +43,7 @@ const app = useApp();
43
43
  clientSecret: app.meta.env.AUTH_GITHUB_CLIENTSECRET || 'Shoule specify clientSecret',
44
44
  },
45
45
  },
46
+ useMockForDev: app.meta.env.AUTH_USEMOCKFORDEV !== 'false',
46
47
  })
47
48
  export class AuthProviderOauth extends BeanAuthProviderOauth2Base {
48
49
  async strategy(
@@ -1,5 +1,6 @@
1
1
  declare module 'vona' {
2
2
  export interface VonaConfigEnv {
3
+ AUTH_USEMOCKFORDEV: 'true' | 'false' | undefined;
3
4
  AUTH_GITHUB_CLIENTID: string | undefined;
4
5
  AUTH_GITHUB_CLIENTSECRET: string | undefined;
5
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-auth",
3
- "version": "5.1.29",
3
+ "version": "5.1.30",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -8,7 +8,7 @@
8
8
  "type": "module",
9
9
  "dependencies": {
10
10
  "vona-module-a-auth": "workspace:^",
11
- "vona-module-auth-oauth": "^5.0.12",
11
+ "vona-module-auth-oauth": "^5.0.13",
12
12
  "vona-module-auth-simple": "workspace:^"
13
13
  },
14
14
  "title": "a-auth"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-rbac",
3
- "version": "5.0.15",
3
+ "version": "5.0.16",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "Vona Module"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-cabloy",
3
- "version": "5.1.66",
3
+ "version": "5.1.67",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -10,7 +10,7 @@
10
10
  "vona-module-a-cabloy": "workspace:^",
11
11
  "vona-module-a-layoutprofile": "^5.0.2",
12
12
  "vona-module-a-markdown": "^5.0.3",
13
- "vona-module-a-rbac": "^5.0.15",
13
+ "vona-module-a-rbac": "^5.0.16",
14
14
  "vona-module-a-socket": "workspace:^",
15
15
  "vona-module-a-ssr": "workspace:^",
16
16
  "vona-module-a-ssrhmr": "workspace:^"