cabloy 5.1.114 → 5.1.116

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 (34) hide show
  1. package/.cabloy-version +1 -1
  2. package/.github/workflows/vona-test-mysql.yml +6 -10
  3. package/.github/workflows/vona-test-pg.yml +6 -10
  4. package/CHANGELOG.md +20 -0
  5. package/cabloy-docs/backend/orm-mutation-guide.md +36 -10
  6. package/cabloy-docs/backend/orm-select-guide.md +15 -10
  7. package/package.json +1 -1
  8. package/vona/packages-vona/vona/package.json +1 -1
  9. package/vona/pnpm-lock.yaml +37 -37
  10. package/vona/pnpm-workspace.yaml +1 -1
  11. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/sku.test.ts +1 -1
  12. package/vona/src/suite/a-commerce/modules/commerce-member/test/addressOwnership.test.ts +4 -1
  13. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/dto/couponIssue.tsx +1 -1
  14. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/service/coupon.ts +4 -1
  15. package/vona/src/suite/a-commerce/modules/commerce-promotion/test/couponReservation.test.ts +85 -2
  16. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/cart.ts +14 -0
  17. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/order.ts +42 -2
  18. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +4 -3
  19. package/vona/src/suite/a-commerce/modules/commerce-trade/test/cartOwnership.test.ts +160 -80
  20. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutReservation.test.ts +255 -1
  21. package/vona/src/suite/a-commerce/modules/commerce-trade/test/checkoutTransaction.test.ts +208 -0
  22. package/vona/src/suite/a-commerce/modules/commerce-trade/test/orderSnapshot.test.ts +28 -4
  23. package/vona/src/suite/a-commerce/modules/commerce-trade/test/reservationExpiry.test.ts +90 -8
  24. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockBalance.test.ts +15 -1
  25. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockReservation.test.ts +20 -2
  26. package/vona/src/suite/a-commerce/modules/commerce-trade/test/testLock.ts +11 -0
  27. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  28. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_crud_inner.ts +3 -0
  29. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_utils.ts +1 -1
  30. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  31. package/zova/pnpm-lock.yaml +31 -31
  32. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/schemas.ts +40 -32
  33. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/types.ts +638 -633
  34. /package/vona/patches/{zova-core@5.1.78.patch → zova-core@5.1.79.patch} +0 -0
@@ -1,31 +1,36 @@
1
1
  import assert from 'node:assert';
2
2
  import { randomUUID } from 'node:crypto';
3
- import { describe, it } from 'node:test';
3
+ import { after, before, describe, it } from 'node:test';
4
4
  import { app } from 'vona-mock';
5
5
 
6
+ import { acquireTestLock } from './testLock.ts';
7
+
6
8
  interface IFixture {
7
9
  categoryId?: number;
8
10
  productId?: number;
9
11
  skuId?: number;
10
12
  balanceId?: number;
13
+ userId?: number;
14
+ couponTemplateId?: number;
15
+ couponGrantId?: number;
11
16
  cartId?: number;
12
17
  addressId?: number;
13
18
  orderId?: number;
14
19
  orderLineId?: number;
15
20
  reservationId?: number;
16
21
  paymentAttemptId?: number;
17
- orderAuditIds?: number[];
18
22
  }
19
23
 
20
24
  async function cleanup(fixture: IFixture) {
21
25
  const trade = app.scope('commerce-trade');
22
26
  const payment = app.scope('commerce-payment');
27
+ const promotion = app.scope('commerce-promotion');
23
28
  const member = app.scope('commerce-member');
24
29
  const catalog = app.scope('commerce-catalog');
25
- if (fixture.paymentAttemptId !== undefined)
26
- await payment.model.paymentAttempt.delete({ id: fixture.paymentAttemptId });
27
30
  if (fixture.orderId !== undefined)
28
31
  await trade.model.orderAudit.delete({ orderId: fixture.orderId });
32
+ if (fixture.paymentAttemptId !== undefined)
33
+ await payment.model.paymentAttempt.delete({ id: fixture.paymentAttemptId });
29
34
  if (fixture.skuId !== undefined) await trade.model.stockAudit.delete({ skuId: fixture.skuId });
30
35
  if (fixture.reservationId !== undefined)
31
36
  await trade.model.stockReservation.delete({ id: fixture.reservationId });
@@ -36,6 +41,17 @@ async function cleanup(fixture: IFixture) {
36
41
  await trade.model.cartItem.delete({ cartId: fixture.cartId });
37
42
  await trade.model.cart.delete({ id: fixture.cartId });
38
43
  }
44
+ if (fixture.addressId !== undefined) await member.model.address.delete({ id: fixture.addressId });
45
+ if (fixture.couponGrantId !== undefined) {
46
+ await promotion.model.couponAudit.delete({ couponGrantId: fixture.couponGrantId });
47
+ await promotion.model.couponGrant.delete({ id: fixture.couponGrantId });
48
+ }
49
+ if (fixture.couponTemplateId !== undefined)
50
+ await promotion.model.couponTemplate.delete({ id: fixture.couponTemplateId });
51
+ if (fixture.userId !== undefined) {
52
+ await app.scope('home-user').model.roleUser.delete({ userId: fixture.userId });
53
+ await app.bean.user.removeById(fixture.userId);
54
+ }
39
55
  if (fixture.balanceId !== undefined)
40
56
  await trade.model.stockBalance.delete({ id: fixture.balanceId });
41
57
  if (fixture.skuId !== undefined) await catalog.model.sku.delete({ id: fixture.skuId });
@@ -43,16 +59,28 @@ async function cleanup(fixture: IFixture) {
43
59
  await catalog.model.product.delete({ id: fixture.productId });
44
60
  if (fixture.categoryId !== undefined)
45
61
  await catalog.model.category.delete({ id: fixture.categoryId });
46
- if (fixture.addressId !== undefined) await member.model.address.delete({ id: fixture.addressId });
47
62
  }
48
63
 
49
- describe('reservationExpiry.test.ts', { concurrency: false }, () => {
64
+ describe('reservationExpiry.test.ts', { concurrency: false, sequential: true }, () => {
65
+ let releaseTestLock: (() => void) | undefined;
66
+
67
+ before(async () => {
68
+ releaseTestLock = await acquireTestLock();
69
+ });
70
+
71
+ after(() => {
72
+ releaseTestLock?.();
73
+ });
74
+
50
75
  it('expires an unpaid order and releases its reservation exactly once', async () => {
51
76
  await app.bean.executor.mockCtx(async () => {
52
77
  const fixture: IFixture = {};
53
78
  const suffix = randomUUID().slice(0, 12);
54
79
  try {
55
- await app.bean.passport.signinMock();
80
+ const customerName = `expiry-customer-${suffix}`;
81
+ const customer = await app.bean.user.register({ name: customerName }, true);
82
+ fixture.userId = customer.id as number;
83
+ await app.bean.passport.signinMock(customerName as any);
56
84
  const userId = app.bean.passport.currentUser!.id;
57
85
  fixture.categoryId = await app.bean.executor.performAction(
58
86
  'post',
@@ -88,6 +116,27 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
88
116
  correlationId: `expiry-stock-${suffix}`,
89
117
  });
90
118
  fixture.balanceId = balance.id as number;
119
+ fixture.couponTemplateId = (
120
+ await app.scope('commerce-promotion').model.couponTemplate.insert({
121
+ name: `expiry-coupon-${suffix}`,
122
+ state: 'active',
123
+ currency: 'USD',
124
+ discountCents: 500,
125
+ minSpendCents: 800,
126
+ validFrom: new Date(Date.now() - 1_000),
127
+ validUntil: new Date(Date.now() + 60_000),
128
+ issuedCount: 0,
129
+ redeemedCount: 0,
130
+ })
131
+ ).id as number;
132
+ fixture.couponGrantId = (
133
+ await app.scope('commerce-promotion').service.coupon.issue({
134
+ templateId: fixture.couponTemplateId,
135
+ userId,
136
+ correlationId: `expiry-coupon-${suffix}`,
137
+ reason: 'expiry fixture',
138
+ })
139
+ ).id as number;
91
140
  fixture.addressId = await app.bean.executor.performAction(
92
141
  'post',
93
142
  '/commerce/member/address',
@@ -112,6 +161,7 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
112
161
  });
113
162
  const created = await app.scope('commerce-trade').service.order.checkout({
114
163
  addressId: fixture.addressId,
164
+ couponGrantId: fixture.couponGrantId,
115
165
  correlationId: `expiry-${suffix}`,
116
166
  });
117
167
  fixture.orderId = created.orderId as number;
@@ -125,7 +175,7 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
125
175
  .model.stockReservation.get({ orderLineId: line?.id });
126
176
  fixture.reservationId = reservation?.id as number;
127
177
  await app.scope('commerce-trade').model.order.updateById(created.orderId, {
128
- reservationExpiresAt: new Date(Date.now() - 1),
178
+ reservationExpiresAt: new Date(Date.now() - 1_000),
129
179
  });
130
180
 
131
181
  assert.equal(
@@ -138,10 +188,42 @@ describe('reservationExpiry.test.ts', { concurrency: false }, () => {
138
188
  );
139
189
  const order = await app.scope('commerce-trade').model.order.getById(created.orderId);
140
190
  assert.equal(order?.state, 'expired');
191
+ const grant = await app
192
+ .scope('commerce-promotion')
193
+ .model.couponGrant.getById(fixture.couponGrantId!);
194
+ assert.equal(grant?.state, 'available');
195
+ assert.equal(grant?.reservationOrderId, undefined);
196
+ assert.equal(grant?.reservationCorrelationId, undefined);
197
+ assert.equal(grant?.reservedAt, undefined);
198
+ const couponAudits = await app.scope('commerce-promotion').model.couponAudit.select({
199
+ where: { couponGrantId: fixture.couponGrantId },
200
+ orders: [['id', 'asc']],
201
+ });
202
+ assert.deepEqual(
203
+ couponAudits.map(item => item.operation),
204
+ ['issue', 'reserve', 'release'],
205
+ );
206
+ assert.equal(couponAudits.filter(item => item.operation === 'release').length, 1);
141
207
  const released = await app
142
208
  .scope('commerce-trade')
143
209
  .model.stockReservation.getById(reservation!.id);
144
210
  assert.equal(released?.state, 'released');
211
+ const releasedBalance = await app
212
+ .scope('commerce-trade')
213
+ .model.stockBalance.getById(fixture.balanceId!);
214
+ assert.deepEqual(
215
+ [releasedBalance?.onHand, releasedBalance?.reserved, releasedBalance?.available],
216
+ [1, 0, 1],
217
+ );
218
+ const stockAudits = await app.scope('commerce-trade').model.stockAudit.select({
219
+ where: { skuId: fixture.skuId },
220
+ orders: [['id', 'asc']],
221
+ });
222
+ assert.deepEqual(
223
+ stockAudits.map(item => item.operation),
224
+ ['adjust', 'reserve', 'release'],
225
+ );
226
+ assert.equal(stockAudits.filter(item => item.operation === 'release').length, 1);
145
227
  const attempt = await app
146
228
  .scope('commerce-payment')
147
229
  .model.paymentAttempt.getById(created.paymentAttemptId);
@@ -3,9 +3,11 @@ import type { DtoStockAdjust, EntityStockBalance } from 'vona-module-commerce-tr
3
3
  import { catchError } from '@cabloy/utils';
4
4
  import assert from 'node:assert';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { describe, it } from 'node:test';
6
+ import { after, before, describe, it } from 'node:test';
7
7
  import { app } from 'vona-mock';
8
8
 
9
+ import { acquireTestLock } from './testLock.ts';
10
+
9
11
  const actionPath = '/commerce/trade/stockBalance/adjustStock';
10
12
 
11
13
  interface IStockFixture {
@@ -80,6 +82,16 @@ async function adjustStock(stockAdjust: DtoStockAdjust): Promise<EntityStockBala
80
82
  }
81
83
 
82
84
  describe('stockBalance.test.ts', { concurrency: false }, () => {
85
+ let releaseTestLock: (() => void) | undefined;
86
+
87
+ before(async () => {
88
+ releaseTestLock = await acquireTestLock();
89
+ });
90
+
91
+ after(() => {
92
+ releaseTestLock?.();
93
+ });
94
+
83
95
  it('action:stockBalance:adjustStock appends an audit with server-scoped balance', async () => {
84
96
  await app.bean.executor.mockCtx(async () => {
85
97
  let fixture: IStockFixture | undefined;
@@ -103,6 +115,7 @@ describe('stockBalance.test.ts', { concurrency: false }, () => {
103
115
 
104
116
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
105
117
  where: { skuId: fixture.skuId },
118
+ orders: [['id', 'asc']],
106
119
  });
107
120
  assert.equal(audits.length, 2);
108
121
  assert.deepEqual(
@@ -141,6 +154,7 @@ describe('stockBalance.test.ts', { concurrency: false }, () => {
141
154
  const [_, err] = await catchError(() =>
142
155
  adjustStock(stockAdjust(fixture.skuId, -3, `${fixture.skuId}-reject`)),
143
156
  );
157
+ assert.equal(err?.code, 409);
144
158
  assert.match(err?.message ?? '', /negative/);
145
159
 
146
160
  const unchanged = await app.scope('commerce-trade').model.stockBalance.getById(balance.id);
@@ -3,9 +3,11 @@ import type { EntityStockReservation } from 'vona-module-commerce-trade';
3
3
  import { catchError } from '@cabloy/utils';
4
4
  import assert from 'node:assert';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { describe, it } from 'node:test';
6
+ import { after, before, describe, it } from 'node:test';
7
7
  import { app } from 'vona-mock';
8
8
 
9
+ import { acquireTestLock } from './testLock.ts';
10
+
9
11
  interface IStockFixture {
10
12
  categoryId: number;
11
13
  productId: number;
@@ -95,7 +97,10 @@ async function assertReservationRejected(skuId: number, suffix: string, expected
95
97
  const balance = await app.scope('commerce-trade').model.stockBalance.get({ skuId });
96
98
  assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
97
99
  assert.equal(await app.scope('commerce-trade').model.stockReservation.get({ skuId }), undefined);
98
- const audits = await app.scope('commerce-trade').model.stockAudit.select({ where: { skuId } });
100
+ const audits = await app.scope('commerce-trade').model.stockAudit.select({
101
+ where: { skuId },
102
+ orders: [['id', 'asc']],
103
+ });
99
104
  assert.deepEqual(
100
105
  audits.map(audit => audit.operation),
101
106
  ['adjust'],
@@ -103,6 +108,16 @@ async function assertReservationRejected(skuId: number, suffix: string, expected
103
108
  }
104
109
 
105
110
  describe('stockReservation.test.ts', { concurrency: false }, () => {
111
+ let releaseTestLock: (() => void) | undefined;
112
+
113
+ before(async () => {
114
+ releaseTestLock = await acquireTestLock();
115
+ });
116
+
117
+ after(() => {
118
+ releaseTestLock?.();
119
+ });
120
+
106
121
  it('reserves and consumes stock exactly once with traceable audits', async () => {
107
122
  await app.bean.executor.mockCtx(async () => {
108
123
  const fixtures: IStockFixturePartial[] = [];
@@ -149,6 +164,7 @@ describe('stockReservation.test.ts', { concurrency: false }, () => {
149
164
  );
150
165
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
151
166
  where: { skuId: fixture.skuId },
167
+ orders: [['id', 'asc']],
152
168
  });
153
169
  assert.deepEqual(
154
170
  audits.map(audit => audit.operation),
@@ -240,6 +256,7 @@ describe('stockReservation.test.ts', { concurrency: false }, () => {
240
256
  assert.deepEqual([balance?.onHand, balance?.reserved, balance?.available], [3, 0, 3]);
241
257
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
242
258
  where: { skuId: fixture.skuId },
259
+ orders: [['id', 'asc']],
243
260
  });
244
261
  assert.equal(audits.length, 6);
245
262
  assert.deepEqual(
@@ -368,6 +385,7 @@ describe('stockReservation.test.ts', { concurrency: false }, () => {
368
385
  });
369
386
  const audits = await app.scope('commerce-trade').model.stockAudit.select({
370
387
  where: { skuId: fixture.skuId },
388
+ orders: [['id', 'asc']],
371
389
  });
372
390
  assert.equal(reservations.length, 1);
373
391
  assert.deepEqual(
@@ -0,0 +1,11 @@
1
+ let pending = Promise.resolve();
2
+
3
+ export async function acquireTestLock(): Promise<() => void> {
4
+ const previous = pending;
5
+ let release: () => void;
6
+ pending = new Promise<void>(resolve => {
7
+ release = resolve;
8
+ });
9
+ await previous;
10
+ return release!;
11
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-orm",
3
- "version": "5.1.25",
3
+ "version": "5.1.26",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "db",
6
6
  "keywords": [
@@ -253,6 +253,9 @@ export class BeanModelCrudInner<TRecord extends {}> extends BeanModelView<TRecor
253
253
  if (!table) return this.scopeOrm.error.ShouldSpecifyTable.throw();
254
254
  // data
255
255
  [data] = await this.prepareData(table, data);
256
+ for (const key in data) {
257
+ if (data[key] === undefined) data[key] = null as never;
258
+ }
256
259
  // where
257
260
  const where = Object.assign({}, options?.where);
258
261
  // id
@@ -49,7 +49,7 @@ export class BeanModelUtils<TRecord extends {}> extends BeanModelMeta<TRecord> {
49
49
  if (Object.prototype.hasOwnProperty.call(item, columnName)) {
50
50
  let value = item[columnName];
51
51
  dataOriginal[columnName] = value;
52
- if (column.type === 'json' && value !== undefined) {
52
+ if (column.type === 'json' && !isNil(value)) {
53
53
  value = JSON.stringify(value);
54
54
  }
55
55
  data[columnName] = value;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-vona",
3
- "version": "5.1.72",
3
+ "version": "5.1.73",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -22,8 +22,8 @@ importers:
22
22
  .:
23
23
  dependencies:
24
24
  '@cabloy/compose':
25
- specifier: ^2.1.8
26
- version: 2.1.8
25
+ specifier: ^2.1.9
26
+ version: 2.1.9
27
27
  '@cabloy/deps':
28
28
  specifier: ^1.1.8
29
29
  version: 1.1.8
@@ -77,7 +77,7 @@ importers:
77
77
  version: 10.5.2(postcss@8.5.15)
78
78
  axios:
79
79
  specifier: ^1.18.1
80
- version: 1.18.1(supports-color@10.2.2)
80
+ version: 1.18.1
81
81
  compression:
82
82
  specifier: ^1.8.1
83
83
  version: 1.8.1
@@ -136,7 +136,7 @@ importers:
136
136
  specifier: workspace:^
137
137
  version: link:packages-zova/zova
138
138
  zova-jsx:
139
- specifier: ^1.1.78
139
+ specifier: ^1.1.79
140
140
  version: link:packages-utils/zova-jsx
141
141
  zova-module-a-api:
142
142
  specifier: workspace:^
@@ -339,7 +339,7 @@ importers:
339
339
  devDependencies:
340
340
  '@cabloy/cli':
341
341
  specifier: ^3.1.28
342
- version: 3.1.28(supports-color@10.2.2)(vue@3.5.38(typescript@5.9.3))
342
+ version: 3.1.28(vue@3.5.38(typescript@5.9.3))
343
343
  '@cabloy/lint':
344
344
  specifier: ^5.1.27
345
345
  version: 5.1.30(@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/rule-tester@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.62.1(typescript@5.9.3))(@typescript-eslint/utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.6.0(jiti@2.7.0))(oxfmt@0.45.0)(oxlint@1.72.0)(supports-color@10.2.2)(typescript@5.9.3)(vue-eslint-parser@10.4.1(eslint@10.6.0(jiti@2.7.0)))
@@ -414,7 +414,7 @@ importers:
414
414
  dependencies:
415
415
  '@cabloy/cli':
416
416
  specifier: ^3.1.28
417
- version: 3.1.28(supports-color@10.2.2)(vue@3.5.38(typescript@5.9.3))
417
+ version: 3.1.28(vue@3.5.38(typescript@5.9.3))
418
418
  '@cabloy/process-helper':
419
419
  specifier: ^3.1.8
420
420
  version: 3.1.8
@@ -448,7 +448,7 @@ importers:
448
448
  version: 7.29.7(@babel/core@7.29.7)
449
449
  '@cabloy/cli':
450
450
  specifier: ^3.1.28
451
- version: 3.1.28(supports-color@10.2.2)(vue@3.5.38(typescript@5.9.3))
451
+ version: 3.1.28(vue@3.5.38(typescript@5.9.3))
452
452
  '@cabloy/extend':
453
453
  specifier: ^3.2.8
454
454
  version: 3.2.8
@@ -687,8 +687,8 @@ importers:
687
687
  packages-utils/zova-jsx:
688
688
  dependencies:
689
689
  '@cabloy/compose':
690
- specifier: ^2.1.8
691
- version: 2.1.8
690
+ specifier: ^2.1.9
691
+ version: 2.1.9
692
692
  '@cabloy/utils':
693
693
  specifier: ^2.1.26
694
694
  version: 2.1.26
@@ -702,7 +702,7 @@ importers:
702
702
  specifier: ^3.5.38
703
703
  version: 3.5.38(typescript@5.9.3)
704
704
  zova-core:
705
- specifier: ^5.1.78
705
+ specifier: ^5.1.79
706
706
  version: link:../../packages-zova/zova-core
707
707
  devDependencies:
708
708
  clean-package:
@@ -843,10 +843,10 @@ importers:
843
843
  packages-zova/zova:
844
844
  dependencies:
845
845
  zova-core:
846
- specifier: ^5.1.78
846
+ specifier: ^5.1.79
847
847
  version: link:../zova-core
848
848
  zova-suite-a-zova:
849
- specifier: ^5.1.138
849
+ specifier: ^5.1.139
850
850
  version: link:../../src/suite-vendor/a-zova
851
851
  devDependencies:
852
852
  clean-package:
@@ -859,8 +859,8 @@ importers:
859
859
  packages-zova/zova-core:
860
860
  dependencies:
861
861
  '@cabloy/compose':
862
- specifier: ^2.1.8
863
- version: 2.1.8
862
+ specifier: ^2.1.9
863
+ version: 2.1.9
864
864
  '@cabloy/extend':
865
865
  specifier: ^3.2.8
866
866
  version: 3.2.8
@@ -1031,7 +1031,7 @@ importers:
1031
1031
  specifier: ^5.1.36
1032
1032
  version: link:modules/a-zod
1033
1033
  zova-module-a-zova:
1034
- specifier: ^5.1.93
1034
+ specifier: ^5.1.94
1035
1035
  version: link:modules/a-zova
1036
1036
 
1037
1037
  src/suite-vendor/a-zova/modules/a-api:
@@ -1105,7 +1105,7 @@ importers:
1105
1105
  dependencies:
1106
1106
  axios:
1107
1107
  specifier: ^1.18.1
1108
- version: 1.18.1(supports-color@10.2.2)
1108
+ version: 1.18.1
1109
1109
  devDependencies:
1110
1110
  clean-package:
1111
1111
  specifier: ^2.2.0
@@ -1346,8 +1346,8 @@ importers:
1346
1346
  src/suite-vendor/a-zova/modules/a-zova:
1347
1347
  dependencies:
1348
1348
  '@cabloy/compose':
1349
- specifier: ^2.1.8
1350
- version: 2.1.8
1349
+ specifier: ^2.1.9
1350
+ version: 2.1.9
1351
1351
  '@cabloy/deps':
1352
1352
  specifier: ^1.1.8
1353
1353
  version: 1.1.8
@@ -1373,12 +1373,12 @@ importers:
1373
1373
  specifier: ^3.7.2
1374
1374
  version: 3.7.2
1375
1375
  zova-jsx:
1376
- specifier: ^1.1.78
1376
+ specifier: ^1.1.79
1377
1377
  version: link:../../../../../packages-utils/zova-jsx
1378
1378
  devDependencies:
1379
1379
  '@cabloy/cli':
1380
1380
  specifier: ^3.1.28
1381
- version: 3.1.28(supports-color@10.2.2)(vue@3.5.38(typescript@5.9.3))
1381
+ version: 3.1.28(vue@3.5.38(typescript@5.9.3))
1382
1382
  '@types/luxon':
1383
1383
  specifier: ^3.7.1
1384
1384
  version: 3.7.2
@@ -2112,8 +2112,8 @@ packages:
2112
2112
  '@cabloy/cli@3.1.28':
2113
2113
  resolution: {integrity: sha512-wZO0cZsi6UbQ4tQt3uIPmBr6GA0xbF0EMHSsqoe2NHtGZFsEQPU9Vb0uAyGjo7GXUtM5nR/9cTs5BCz6ehtfdA==}
2114
2114
 
2115
- '@cabloy/compose@2.1.8':
2116
- resolution: {integrity: sha512-TdEr9BY54BYoIlTjkrOKkzK8yJWmP07OrRTh4punJMnWzM+oDExQ2EGCGAHXnEHjLWqdhyMGm/ejmxnVgBmraQ==}
2115
+ '@cabloy/compose@2.1.9':
2116
+ resolution: {integrity: sha512-b+EB7EDQz7dDdrvFEmRIpGpW0jvDEmYGChSbKx0wzki6AGCj0z3lNm4qnkgM5+CTQIKBU2FmvDcQjU5r6Cj6SA==}
2117
2117
 
2118
2118
  '@cabloy/deps@1.1.8':
2119
2119
  resolution: {integrity: sha512-CWaVGSwPI5qLSuRF+WmB+1CwbRe9+PR+nkUmKc9/Dj7sB75qPXLTYACn23T/jIylbDbWCL82LoOa455Vgseyeg==}
@@ -8351,7 +8351,7 @@ snapshots:
8351
8351
 
8352
8352
  '@bufbuild/protobuf@2.12.1': {}
8353
8353
 
8354
- '@cabloy/cli@3.1.28(supports-color@10.2.2)(vue@3.5.38(typescript@5.9.3))':
8354
+ '@cabloy/cli@3.1.28(vue@3.5.38(typescript@5.9.3))':
8355
8355
  dependencies:
8356
8356
  '@babel/parser': 7.29.7
8357
8357
  '@cabloy/module-glob': 5.3.17
@@ -8360,7 +8360,7 @@ snapshots:
8360
8360
  '@cabloy/utils': 2.1.26
8361
8361
  '@cabloy/word-utils': link:packages-utils/word-utils
8362
8362
  '@npmcli/config': 10.11.0
8363
- '@zhennann/common-bin': 4.0.1(supports-color@10.2.2)
8363
+ '@zhennann/common-bin': 4.0.1
8364
8364
  '@zhennann/ejs': 3.0.1
8365
8365
  boxen: 4.2.0
8366
8366
  chalk: 3.0.0
@@ -8379,7 +8379,7 @@ snapshots:
8379
8379
  - supports-color
8380
8380
  - vue
8381
8381
 
8382
- '@cabloy/compose@2.1.8': {}
8382
+ '@cabloy/compose@2.1.9': {}
8383
8383
 
8384
8384
  '@cabloy/deps@1.1.8': {}
8385
8385
 
@@ -10386,7 +10386,7 @@ snapshots:
10386
10386
 
10387
10387
  '@vue/shared@3.5.13': {}
10388
10388
 
10389
- '@zhennann/common-bin@4.0.1(supports-color@10.2.2)':
10389
+ '@zhennann/common-bin@4.0.1':
10390
10390
  dependencies:
10391
10391
  chalk: 4.1.2
10392
10392
  change-case: 4.1.2
@@ -10420,7 +10420,7 @@ snapshots:
10420
10420
 
10421
10421
  acorn@8.17.0: {}
10422
10422
 
10423
- agent-base@6.0.2(supports-color@10.2.2):
10423
+ agent-base@6.0.2:
10424
10424
  dependencies:
10425
10425
  debug: 4.4.3(supports-color@10.2.2)
10426
10426
  transitivePeerDependencies:
@@ -10532,11 +10532,11 @@ snapshots:
10532
10532
  dependencies:
10533
10533
  possible-typed-array-names: 1.1.0
10534
10534
 
10535
- axios@1.18.1(supports-color@10.2.2):
10535
+ axios@1.18.1:
10536
10536
  dependencies:
10537
10537
  follow-redirects: 1.16.0
10538
10538
  form-data: 4.0.6
10539
- https-proxy-agent: 5.0.1(supports-color@10.2.2)
10539
+ https-proxy-agent: 5.0.1
10540
10540
  proxy-from-env: 2.1.0
10541
10541
  transitivePeerDependencies:
10542
10542
  - debug
@@ -11958,9 +11958,9 @@ snapshots:
11958
11958
  statuses: 2.0.2
11959
11959
  toidentifier: 1.0.1
11960
11960
 
11961
- https-proxy-agent@5.0.1(supports-color@10.2.2):
11961
+ https-proxy-agent@5.0.1:
11962
11962
  dependencies:
11963
- agent-base: 6.0.2(supports-color@10.2.2)
11963
+ agent-base: 6.0.2
11964
11964
  debug: 4.4.3(supports-color@10.2.2)
11965
11965
  transitivePeerDependencies:
11966
11966
  - supports-color
@@ -28,6 +28,38 @@ export type ApiSchemaCommerceMemberDtoAddressUpdate =
28
28
  components['schemas']['commerce-member.dto.addressUpdate'];
29
29
  export type ApiSchemaCommerceMemberDtoAddressUpdatePartial =
30
30
  Partial<ApiSchemaCommerceMemberDtoAddressUpdate>;
31
+ export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b =
32
+ components['schemas']['home-user.dto.passport_2d063d28bc7243bed02ebd8bddf1212a93c6305b'];
33
+ export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305bPartial =
34
+ Partial<ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b>;
35
+ export type ApiSchemaHomeUserEntityUser = components['schemas']['home-user.entity.user'];
36
+ export type ApiSchemaHomeUserEntityUserPartial = Partial<ApiSchemaHomeUserEntityUser>;
37
+ export type ApiSchemaAAuthDtoAuth = components['schemas']['a-auth.dto.auth'];
38
+ export type ApiSchemaAAuthDtoAuthPartial = Partial<ApiSchemaAAuthDtoAuth>;
39
+ export type ApiSchemaHomeUserEntityRole = components['schemas']['home-user.entity.role'];
40
+ export type ApiSchemaHomeUserEntityRolePartial = Partial<ApiSchemaHomeUserEntityRole>;
41
+ export type ApiSchemaHomeUserDtoPassportJwt = components['schemas']['home-user.dto.passportJwt'];
42
+ export type ApiSchemaHomeUserDtoPassportJwtPartial = Partial<ApiSchemaHomeUserDtoPassportJwt>;
43
+ export type ApiSchemaHomeUserDtoPassport = components['schemas']['home-user.dto.passport'];
44
+ export type ApiSchemaHomeUserDtoPassportPartial = Partial<ApiSchemaHomeUserDtoPassport>;
45
+ export type ApiSchemaAJwtDtoJwtToken = components['schemas']['a-jwt.dto.jwtToken'];
46
+ export type ApiSchemaAJwtDtoJwtTokenPartial = Partial<ApiSchemaAJwtDtoJwtToken>;
47
+ export type ApiSchemaHomeUserDtoRegister = components['schemas']['home-user.dto.register'];
48
+ export type ApiSchemaHomeUserDtoRegisterPartial = Partial<ApiSchemaHomeUserDtoRegister>;
49
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9 =
50
+ components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9'];
51
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9Partial =
52
+ Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9>;
53
+ export type ApiSchemaHomeUserDtoLogin = components['schemas']['home-user.dto.login'];
54
+ export type ApiSchemaHomeUserDtoLoginPartial = Partial<ApiSchemaHomeUserDtoLogin>;
55
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661 =
56
+ components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661'];
57
+ export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661Partial =
58
+ Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661>;
59
+ export type ApiSchemaCommerceSiteadminDtoOperatorContext =
60
+ components['schemas']['commerce-siteadmin.dto.operatorContext'];
61
+ export type ApiSchemaCommerceSiteadminDtoOperatorContextPartial =
62
+ Partial<ApiSchemaCommerceSiteadminDtoOperatorContext>;
31
63
  export type ApiSchemaCommercePromotionDtoCouponMineItem =
32
64
  components['schemas']['commerce-promotion.dto.couponMineItem'];
33
65
  export type ApiSchemaCommercePromotionDtoCouponMineItemPartial =
@@ -70,6 +102,14 @@ export type ApiSchemaCommerceTradeDtoCartUpdateItem =
70
102
  components['schemas']['commerce-trade.dto.cartUpdateItem'];
71
103
  export type ApiSchemaCommerceTradeDtoCartUpdateItemPartial =
72
104
  Partial<ApiSchemaCommerceTradeDtoCartUpdateItem>;
105
+ export type ApiSchemaCommerceTradeDtoCheckoutResult =
106
+ components['schemas']['commerce-trade.dto.checkoutResult'];
107
+ export type ApiSchemaCommerceTradeDtoCheckoutResultPartial =
108
+ Partial<ApiSchemaCommerceTradeDtoCheckoutResult>;
109
+ export type ApiSchemaCommerceTradeDtoCheckoutCreate =
110
+ components['schemas']['commerce-trade.dto.checkoutCreate'];
111
+ export type ApiSchemaCommerceTradeDtoCheckoutCreatePartial =
112
+ Partial<ApiSchemaCommerceTradeDtoCheckoutCreate>;
73
113
  export type ApiSchemaCommerceTradeDtoStockAuditSelectRes =
74
114
  components['schemas']['commerce-trade.dto.stockAuditSelectRes'];
75
115
  export type ApiSchemaCommerceTradeDtoStockAuditSelectResPartial =
@@ -182,38 +222,6 @@ export type ApiSchemaCommerceCatalogDtoSkuUpdate =
182
222
  components['schemas']['commerce-catalog.dto.skuUpdate'];
183
223
  export type ApiSchemaCommerceCatalogDtoSkuUpdatePartial =
184
224
  Partial<ApiSchemaCommerceCatalogDtoSkuUpdate>;
185
- export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b =
186
- components['schemas']['home-user.dto.passport_2d063d28bc7243bed02ebd8bddf1212a93c6305b'];
187
- export type ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305bPartial =
188
- Partial<ApiSchemaHomeUserDtoPassport_2d063d28bc7243bed02ebd8bddf1212a93c6305b>;
189
- export type ApiSchemaHomeUserEntityUser = components['schemas']['home-user.entity.user'];
190
- export type ApiSchemaHomeUserEntityUserPartial = Partial<ApiSchemaHomeUserEntityUser>;
191
- export type ApiSchemaAAuthDtoAuth = components['schemas']['a-auth.dto.auth'];
192
- export type ApiSchemaAAuthDtoAuthPartial = Partial<ApiSchemaAAuthDtoAuth>;
193
- export type ApiSchemaHomeUserEntityRole = components['schemas']['home-user.entity.role'];
194
- export type ApiSchemaHomeUserEntityRolePartial = Partial<ApiSchemaHomeUserEntityRole>;
195
- export type ApiSchemaHomeUserDtoPassportJwt = components['schemas']['home-user.dto.passportJwt'];
196
- export type ApiSchemaHomeUserDtoPassportJwtPartial = Partial<ApiSchemaHomeUserDtoPassportJwt>;
197
- export type ApiSchemaHomeUserDtoPassport = components['schemas']['home-user.dto.passport'];
198
- export type ApiSchemaHomeUserDtoPassportPartial = Partial<ApiSchemaHomeUserDtoPassport>;
199
- export type ApiSchemaAJwtDtoJwtToken = components['schemas']['a-jwt.dto.jwtToken'];
200
- export type ApiSchemaAJwtDtoJwtTokenPartial = Partial<ApiSchemaAJwtDtoJwtToken>;
201
- export type ApiSchemaHomeUserDtoRegister = components['schemas']['home-user.dto.register'];
202
- export type ApiSchemaHomeUserDtoRegisterPartial = Partial<ApiSchemaHomeUserDtoRegister>;
203
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9 =
204
- components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9'];
205
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9Partial =
206
- Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9>;
207
- export type ApiSchemaHomeUserDtoLogin = components['schemas']['home-user.dto.login'];
208
- export type ApiSchemaHomeUserDtoLoginPartial = Partial<ApiSchemaHomeUserDtoLogin>;
209
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661 =
210
- components['schemas']['a-captcha.dto.captchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661'];
211
- export type ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661Partial =
212
- Partial<ApiSchemaACaptchaDtoCaptchaVerify_67c39cad0735f2460ecc6bef838440b07c4dcfa9_f73253d699f0fd90b98fded80a123a0a180dbca2_144c29cc01b745c0021a6682766a475fe639fb8f_626802c24df1498cec99aab0854fedf90c9b6dd3_9aa4df25b9311e645e1c9dfbe6b7ece6398da661>;
213
- export type ApiSchemaCommerceSiteadminDtoOperatorContext =
214
- components['schemas']['commerce-siteadmin.dto.operatorContext'];
215
- export type ApiSchemaCommerceSiteadminDtoOperatorContextPartial =
216
- Partial<ApiSchemaCommerceSiteadminDtoOperatorContext>;
217
225
  export type ApiSchemaAMenuDtoMenus = components['schemas']['a-menu.dto.menus'];
218
226
  export type ApiSchemaAMenuDtoMenusPartial = Partial<ApiSchemaAMenuDtoMenus>;
219
227
  export type ApiSchemaAMenuDtoMenuItem = components['schemas']['a-menu.dto.menuItem'];