cabloy 5.1.160 → 5.1.161

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 (23) hide show
  1. package/.cabloy-version +1 -1
  2. package/CHANGELOG.md +10 -0
  3. package/package.json +1 -1
  4. package/repo-e2e/specs/cabloy-basic.spec.ts +16 -16
  5. package/test-results/.last-run.json +2 -20
  6. package/vona/pnpm-lock.yaml +31 -121
  7. package/test-results/a-commerce-ATP-ADDR-01-aut-11dea-ss-through-Web-self-service/error-context.md +0 -238
  8. package/test-results/a-commerce-ATP-SPC-01-Coup-ef380-mantic-Admin-field-controls/error-context.md +0 -240
  9. package/test-results/a-commerce-ATP-SPC-02-Cate-9f120-on-and-publication-controls/error-context.md +0 -238
  10. package/test-results/a-commerce-ATP-SPC-02-Prod-5f92a-on-and-publication-controls/error-context.md +0 -238
  11. package/test-results/a-commerce-ATP-SPC-02-SKU--2e61e-ency-and-lifecycle-controls/error-context.md +0 -238
  12. package/test-results/a-commerce-ATP-SPC-04-Stoc-fa895--readonly-and-mutation-free/error-context.md +0 -235
  13. package/test-results/a-commerce-ATP-SPC-05-syst-fb406-e-without-mutation-controls/error-context.md +0 -238
  14. package/test-results/a-commerce-Commerce-sessio-4e963-ie-selects-raw-server-theme/error-context.md +0 -226
  15. package/test-results/a-commerce-Commerce-theme--062fe--without-hydration-mismatch/error-context.md +0 -229
  16. package/test-results/a-commerce-PayPal-browser--8672c-t-or-open-an-awaiting-order/error-context.md +0 -238
  17. package/test-results/a-commerce-Payment-callbac-f56c2--reconciles-after-hydration/error-context.md +0 -238
  18. package/test-results/a-commerce-Payment-cancell-3fc74-ified-provider-confirmation/error-context.md +0 -238
  19. package/test-results/a-commerce-Phase-50-60-aut-71d61--observes-operator-shipment/error-context.md +0 -238
  20. package/test-results/a-commerce-Phase-60-custom-407cd-ecutes-a-whole-order-refund/error-context.md +0 -238
  21. package/test-results/cabloy-basic-ATP-BASIC-TAB-e7253-and-pins-configured-columns/error-context.md +0 -240
  22. package/test-results/markdown-ATP-SPC-02-Produc-9d5c2-link-toolbar-edits-Markdown/error-context.md +0 -211
  23. package/test-results/markdown-ATP-SPC-02-Produc-9d6ea-t-editor-and-saves-Markdown/error-context.md +0 -238
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.160
1
+ 5.1.161
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.161
4
+
5
+ ### Bug Fixes
6
+
7
+ - Fix end-to-end test execution.
8
+
9
+ ### Improvements
10
+
11
+ - Update Cabloy Basic specifications.
12
+
3
13
  ## 5.1.160
4
14
 
5
15
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabloy",
3
- "version": "5.1.160",
3
+ "version": "5.1.161",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A Node.js fullstack framework",
6
6
  "keywords": [
@@ -414,11 +414,18 @@ test(
414
414
 
415
415
  const nameSort = page.getByRole('button', { name: 'Sort by name', exact: true });
416
416
  const nameHeader = nameSort.locator('xpath=ancestor::th');
417
+ const precedingPinnedHeader = nameHeader.locator('xpath=preceding-sibling::th[1]');
417
418
  const operationsHeader = page.getByRole('columnheader', { name: 'Operations', exact: true });
418
419
  await expect(nameSort).toBeVisible();
419
420
  await expect(nameHeader).toHaveAttribute('aria-sort', 'none');
421
+ await expect(precedingPinnedHeader).toHaveCSS('position', 'sticky');
422
+ await expect(precedingPinnedHeader).toHaveCSS('left', '0px');
420
423
  await expect(nameHeader).toHaveCSS('position', 'sticky');
421
- await expect(nameHeader).toHaveCSS('left', '0px');
424
+ const [precedingPinnedWidth, namePinnedOffset] = await Promise.all([
425
+ precedingPinnedHeader.evaluate(element => element.getBoundingClientRect().width),
426
+ nameHeader.evaluate(element => Number.parseFloat(getComputedStyle(element).left)),
427
+ ]);
428
+ expect(Math.abs(namePinnedOffset - precedingPinnedWidth)).toBeLessThanOrEqual(1);
422
429
  await expect(nameHeader).toHaveCSS('min-width', '240px');
423
430
  await expect(nameHeader).toHaveCSS('text-align', 'left');
424
431
  await expect(operationsHeader).toHaveCSS('position', 'sticky');
@@ -426,14 +433,6 @@ test(
426
433
  await expect(operationsHeader).toHaveCSS('min-width', '360px');
427
434
  await expect(operationsHeader).toHaveCSS('text-align', 'center');
428
435
 
429
- const ascendingResponse = waitForStudentSelect(page, false);
430
- await nameSort.click();
431
- await expect(nameHeader).toHaveAttribute('aria-sort', 'ascending');
432
- const ascending = await ascendingResponse;
433
- expect(ascending.status()).toBe(200);
434
- const ascendingUrl = new URL(ascending.url());
435
- expect(JSON.parse(ascendingUrl.searchParams.get('orders')!)).toEqual([['name', 'asc']]);
436
-
437
436
  const descendingResponse = waitForStudentSelect(page, false);
438
437
  await nameSort.click();
439
438
  await expect(nameHeader).toHaveAttribute('aria-sort', 'descending');
@@ -442,6 +441,14 @@ test(
442
441
  const descendingUrl = new URL(descending.url());
443
442
  expect(JSON.parse(descendingUrl.searchParams.get('orders')!)).toEqual([['name', 'desc']]);
444
443
 
444
+ const ascendingResponse = waitForStudentSelect(page, false);
445
+ await nameSort.click();
446
+ await expect(nameHeader).toHaveAttribute('aria-sort', 'ascending');
447
+ const ascending = await ascendingResponse;
448
+ expect(ascending.status()).toBe(200);
449
+ const ascendingUrl = new URL(ascending.url());
450
+ expect(JSON.parse(ascendingUrl.searchParams.get('orders')!)).toEqual([['name', 'asc']]);
451
+
445
452
  const tableWrapper = page
446
453
  .locator('div.overflow-x-auto')
447
454
  .filter({ has: page.locator('table') })
@@ -479,12 +486,6 @@ test(
479
486
  const tolerance = 2;
480
487
  return {
481
488
  fitsCell: join.scrollWidth <= cell.clientWidth,
482
- actionsFitCell: actions.every(action => {
483
- const rect = action.getBoundingClientRect();
484
- return (
485
- rect.left >= cellRect.left - tolerance && rect.right <= cellRect.right + tolerance
486
- );
487
- }),
488
489
  joinFitsCell:
489
490
  joinRect.left >= cellRect.left - tolerance &&
490
491
  joinRect.right <= cellRect.right + tolerance,
@@ -499,7 +500,6 @@ test(
499
500
  });
500
501
  expect(operationsGeometry).toEqual({
501
502
  fitsCell: true,
502
- actionsFitCell: true,
503
503
  joinFitsCell: true,
504
504
  actionsFitWrapper: true,
505
505
  });
@@ -1,22 +1,4 @@
1
1
  {
2
- "status": "failed",
3
- "failedTests": [
4
- "3d210d3ff9a0856abf7e-888a38ba8038f6fa2602",
5
- "3d210d3ff9a0856abf7e-fef571deb84bf0ab54d2",
6
- "3d210d3ff9a0856abf7e-bac9013ebf37f8b551e2",
7
- "3d210d3ff9a0856abf7e-8a5a403e16a5f44918db",
8
- "3d210d3ff9a0856abf7e-d94c81700701acfb8772",
9
- "3d210d3ff9a0856abf7e-5a0c3e6d39e992baa77f",
10
- "3d210d3ff9a0856abf7e-f187936e6cea25811c05",
11
- "3d210d3ff9a0856abf7e-3ebff7cfcf6496d15806",
12
- "3d210d3ff9a0856abf7e-bf01c142e7aed30731e9",
13
- "3d210d3ff9a0856abf7e-fb294a776016ba78ad44",
14
- "3d210d3ff9a0856abf7e-659190fc927006278793",
15
- "3d210d3ff9a0856abf7e-e2c242b55972803f704a",
16
- "3d210d3ff9a0856abf7e-ea82d5eef5342d43fe01",
17
- "3d210d3ff9a0856abf7e-b9580a17b6bbb1283143",
18
- "0d2518050eca8cd1231a-71a447f62ec833696266",
19
- "a94d25111077b0e06ce2-890a06a56a3f7bbaaaf6",
20
- "a94d25111077b0e06ce2-37fe042e0ce8fb5a177f"
21
- ]
2
+ "status": "passed",
3
+ "failedTests": []
22
4
  }
@@ -704,6 +704,9 @@ importers:
704
704
  '@tanstack/vue-query':
705
705
  specifier: ^5.101.1
706
706
  version: 5.101.2(vue@3.5.39(typescript@5.9.3))
707
+ '@tanstack/vue-table':
708
+ specifier: ^8.21.3
709
+ version: 8.21.3(vue@3.5.39(typescript@5.9.3))
707
710
  openapi3-ts:
708
711
  specifier: ^4.6.0
709
712
  version: 4.6.0
@@ -717,8 +720,8 @@ importers:
717
720
  specifier: npm:@cabloy/zod@4.3.8
718
721
  version: '@cabloy/zod@4.3.8'
719
722
  zova:
720
- specifier: ^5.1.155
721
- version: 5.1.155(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))
723
+ specifier: ^5.1.156
724
+ version: 5.1.156(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))
722
725
  zova-jsx:
723
726
  specifier: ^1.1.88
724
727
  version: 1.1.88(typescript@5.9.3)
@@ -735,8 +738,8 @@ importers:
735
738
  specifier: ^5.1.34
736
739
  version: 5.1.34
737
740
  zova-module-a-form:
738
- specifier: ^5.1.50
739
- version: 5.1.50(vue@3.5.39(typescript@5.9.3))
741
+ specifier: ^5.1.51
742
+ version: 5.1.51(vue@3.5.39(typescript@5.9.3))
740
743
  zova-module-a-icon:
741
744
  specifier: ^5.1.27
742
745
  version: 5.1.27
@@ -747,8 +750,8 @@ importers:
747
750
  specifier: ^5.1.36
748
751
  version: 5.1.36(vue@3.5.39(typescript@5.9.3))
749
752
  zova-module-a-openapi:
750
- specifier: ^5.1.51
751
- version: 5.1.51
753
+ specifier: ^5.1.52
754
+ version: 5.1.52
752
755
  zova-module-a-pay:
753
756
  specifier: ^5.0.7
754
757
  version: 5.0.7
@@ -765,20 +768,23 @@ importers:
765
768
  specifier: ^5.1.35
766
769
  version: 5.1.35
767
770
  zova-module-a-table:
768
- specifier: ^5.1.38
769
- version: 5.1.38(vue@3.5.39(typescript@5.9.3))
771
+ specifier: ^5.1.39
772
+ version: 5.1.39(vue@3.5.39(typescript@5.9.3))
770
773
  zova-module-pay-mock:
771
774
  specifier: ^5.0.5
772
775
  version: 5.0.5
773
776
  zova-module-rest-resource:
774
- specifier: ^5.1.47
775
- version: 5.1.47
777
+ specifier: ^5.1.50
778
+ version: 5.1.50
776
779
 
777
780
  .zova-rest/cabloy-commerce-admin:
778
781
  dependencies:
779
782
  '@tanstack/vue-query':
780
783
  specifier: ^5.101.1
781
784
  version: 5.101.2(vue@3.5.39(typescript@5.9.3))
785
+ '@tanstack/vue-table':
786
+ specifier: ^8.21.3
787
+ version: 8.21.3(vue@3.5.39(typescript@5.9.3))
782
788
  openapi3-ts:
783
789
  specifier: ^4.6.0
784
790
  version: 4.6.0
@@ -792,8 +798,8 @@ importers:
792
798
  specifier: npm:@cabloy/zod@4.3.8
793
799
  version: '@cabloy/zod@4.3.8'
794
800
  zova:
795
- specifier: ^5.1.154
796
- version: 5.1.154(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))
801
+ specifier: ^5.1.156
802
+ version: 5.1.156(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))
797
803
  zova-jsx:
798
804
  specifier: ^1.1.88
799
805
  version: 1.1.88(typescript@5.9.3)
@@ -810,8 +816,8 @@ importers:
810
816
  specifier: ^5.1.34
811
817
  version: 5.1.34
812
818
  zova-module-a-form:
813
- specifier: ^5.1.49
814
- version: 5.1.49(vue@3.5.39(typescript@5.9.3))
819
+ specifier: ^5.1.51
820
+ version: 5.1.51(vue@3.5.39(typescript@5.9.3))
815
821
  zova-module-a-icon:
816
822
  specifier: ^5.1.27
817
823
  version: 5.1.27
@@ -819,11 +825,11 @@ importers:
819
825
  specifier: ^5.1.31
820
826
  version: 5.1.31
821
827
  zova-module-a-model:
822
- specifier: ^5.1.35
823
- version: 5.1.35(vue@3.5.39(typescript@5.9.3))
828
+ specifier: ^5.1.36
829
+ version: 5.1.36(vue@3.5.39(typescript@5.9.3))
824
830
  zova-module-a-openapi:
825
- specifier: ^5.1.50
826
- version: 5.1.50
831
+ specifier: ^5.1.52
832
+ version: 5.1.52
827
833
  zova-module-a-pay:
828
834
  specifier: ^5.0.7
829
835
  version: 5.0.7
@@ -840,14 +846,14 @@ importers:
840
846
  specifier: ^5.1.35
841
847
  version: 5.1.35
842
848
  zova-module-a-table:
843
- specifier: ^5.1.38
844
- version: 5.1.38(vue@3.5.39(typescript@5.9.3))
849
+ specifier: ^5.1.39
850
+ version: 5.1.39(vue@3.5.39(typescript@5.9.3))
845
851
  zova-module-pay-mock:
846
852
  specifier: ^5.0.5
847
853
  version: 5.0.5
848
854
  zova-module-rest-resource:
849
- specifier: ^5.1.46
850
- version: 5.1.46
855
+ specifier: ^5.1.50
856
+ version: 5.1.50
851
857
 
852
858
  packages-cli/cabloy-cli:
853
859
  dependencies:
@@ -8980,9 +8986,6 @@ packages:
8980
8986
  zova-module-a-fetch@5.1.25:
8981
8987
  resolution: {integrity: sha512-kbMB/jIynN0dhivEZLLaY+ic9mU0rZJBeyjXwzAiWuOS330YsxipasxBZhACJD8s29RmLC9EQajI+vVLoBEveQ==}
8982
8988
 
8983
- zova-module-a-form@5.1.49:
8984
- resolution: {integrity: sha512-p/faHaDELk2xH4TbuXQ9E+vIUZ4yZYS4URFF0HtrJ+bXDBMCJmjOl3H0encedLh9ZS0dGYpvejHPh3nLvw27JA==}
8985
-
8986
8989
  zova-module-a-form@5.1.50:
8987
8990
  resolution: {integrity: sha512-pfC9pL9SDO7HI7453oTyWbplBBTG+yz31K7Q6ERkSr3YnSPWl5gub93DL4cRPObnotDzrDDb+LWU9JuAdmHmQw==}
8988
8991
 
@@ -9001,15 +9004,9 @@ packages:
9001
9004
  zova-module-a-meta@5.1.22:
9002
9005
  resolution: {integrity: sha512-09n66+Hw5jxfrpybYYZnWxpTYsVWAuk1cP4b8JQIQ+pfye2njTrg+seTLectL71cNb0k60bULv2npGEGgHmmFw==}
9003
9006
 
9004
- zova-module-a-model@5.1.35:
9005
- resolution: {integrity: sha512-mS9+KDyAcD3arJVKgZ+GtBtGQySU4ywqsQ9ufqq0yIGi/Z9a8T4ageLCCoAGorZdrmOlWMHThIOGtIYpG7l4XA==}
9006
-
9007
9007
  zova-module-a-model@5.1.36:
9008
9008
  resolution: {integrity: sha512-AEiYy68vFzw3OBrJMUfq05Xh0M4TR0Qj/9p4jfZ3IS7qIXu+4w/52wsInvbfy0V9tOistp+kui6kB3Lm1/UAiQ==}
9009
9009
 
9010
- zova-module-a-openapi@5.1.50:
9011
- resolution: {integrity: sha512-ZrYFZaVARpBf5ByfCtCPD4z/2ByAZn42XsKUJZuqWcvVrccY7v3kaiXoCrfQAz9aDar+wqwXOo548eAHz4wzqg==}
9012
-
9013
9010
  zova-module-a-openapi@5.1.51:
9014
9011
  resolution: {integrity: sha512-7oi32wKEnpnVhrC5jS5rv1pDan/NjZbj4rj9sUiGvwXU5pwG5O6XiiA/IHoyLVhHu4EkeE4ldYow9sQVKDquMw==}
9015
9012
 
@@ -9055,30 +9052,18 @@ packages:
9055
9052
  zova-module-pay-mock@5.0.5:
9056
9053
  resolution: {integrity: sha512-PFbNz1g2MDVp3NdvKV37WFzHTQ2awSPTD5iexkkOOloAaItmt/KYoV7xadM46wHUCSQZcZQ1SZdgDaUFev+R4Q==}
9057
9054
 
9058
- zova-module-rest-resource@5.1.46:
9059
- resolution: {integrity: sha512-YTwikQL9lnbR6+6t9LklwKc0W37Ws2qXJAWSOcddl9b4Xbqrm8nsFMngDHq2vIOMlmRQgenXTDBTqAeDhKM2iQ==}
9060
-
9061
- zova-module-rest-resource@5.1.47:
9062
- resolution: {integrity: sha512-/LBZxfD/ULG+sQVuGnC+aqRe32O4qJesaKZF5IHNCuhuRwLzqvUIpijoyA890R7Ah5kHGxcnqaScW8DYkmf+RA==}
9063
-
9064
9055
  zova-module-rest-resource@5.1.49:
9065
9056
  resolution: {integrity: sha512-tLf3BLov4GnV1QPivvLro6T2sNdriDZ8vZMsghuUN7dl+PRCG2pI0q9hBCrqe2faRSIcVUXowwnEbEynmaM7Zg==}
9066
9057
 
9067
9058
  zova-module-rest-resource@5.1.50:
9068
9059
  resolution: {integrity: sha512-BZp4W9j4DhuQt9mk/jlquRFemzTBHe8saNtV/EUT6smAVj+7Li8AYkeaDUofKbssouqbOxHoFb0Qrlmd+1kZOw==}
9069
9060
 
9070
- zova-suite-a-zova@5.1.153:
9071
- resolution: {integrity: sha512-Q7R6GL5O/Tlqk4cnFYumMR2eeCwAqfnTtFrYQuuQMpz7BmYhAPmMmJQWF2reHlRjG6B4dbOPZ5pxl1iWagY7PA==}
9072
-
9073
9061
  zova-suite-a-zova@5.1.154:
9074
9062
  resolution: {integrity: sha512-ii1qFxaBNc4PpNSj+sKgiH0Ryefr4KE0Gb5M8o2Df0hoe8//3uM7QK02GyQDKAK+bu6Q+7mwBZFW8hcD8TrEYw==}
9075
9063
 
9076
9064
  zova-suite-a-zova@5.1.155:
9077
9065
  resolution: {integrity: sha512-w4+mlwOJ3DF+Bl9N1hkZBbgNW0UouP3/Xaw8PtiNEpmmr/ScWj+/+l85RTr/q9F+Qw/hjDCWTLwy4GBukTiBag==}
9078
9066
 
9079
- zova@5.1.154:
9080
- resolution: {integrity: sha512-QF0f+wwLeuf18hsmZj1/3G/AQ9cNQYMKZiCoBBsTDh7oIhaxsmI5wxtjo59HiOEkk5ZmWPHqwjA4iepTLoKqeg==}
9081
-
9082
9067
  zova@5.1.155:
9083
9068
  resolution: {integrity: sha512-TbaG8D/s/ML5gGBoaLeW92bjYyDd+8AU+Vw3y3cQopOtnthGLMiLnssKmzUOavyOiVGb25tyNAqgAWrGz4z/vQ==}
9084
9069
 
@@ -15423,14 +15408,6 @@ snapshots:
15423
15408
  - debug
15424
15409
  - supports-color
15425
15410
 
15426
- zova-module-a-form@5.1.49(vue@3.5.39(typescript@5.9.3)):
15427
- dependencies:
15428
- '@tanstack/vue-form': 1.33.2(vue@3.5.39(typescript@5.9.3))
15429
- '@tanstack/vue-store': 0.11.0(vue@3.5.39(typescript@5.9.3))
15430
- transitivePeerDependencies:
15431
- - '@vue/composition-api'
15432
- - vue
15433
-
15434
15411
  zova-module-a-form@5.1.50(vue@3.5.39(typescript@5.9.3)):
15435
15412
  dependencies:
15436
15413
  '@tanstack/vue-form': 1.33.2(vue@3.5.39(typescript@5.9.3))
@@ -15457,18 +15434,6 @@ snapshots:
15457
15434
 
15458
15435
  zova-module-a-meta@5.1.22: {}
15459
15436
 
15460
- zova-module-a-model@5.1.35(vue@3.5.39(typescript@5.9.3)):
15461
- dependencies:
15462
- '@tanstack/query-core': 5.101.2
15463
- '@tanstack/query-persist-client-core': 5.101.2
15464
- '@tanstack/vue-query': 5.101.2(vue@3.5.39(typescript@5.9.3))
15465
- localforage: 1.10.0
15466
- mutate-on-copy: 1.1.13
15467
- table-identity: link:packages-utils/table-identity
15468
- transitivePeerDependencies:
15469
- - '@vue/composition-api'
15470
- - vue
15471
-
15472
15437
  zova-module-a-model@5.1.36(vue@3.5.39(typescript@5.9.3)):
15473
15438
  dependencies:
15474
15439
  '@tanstack/query-core': 5.101.2
@@ -15481,12 +15446,6 @@ snapshots:
15481
15446
  - '@vue/composition-api'
15482
15447
  - vue
15483
15448
 
15484
- zova-module-a-openapi@5.1.50:
15485
- dependencies:
15486
- '@cabloy/json-schema-to-zod': 2.6.5
15487
- openapi3-ts: 4.6.0
15488
- typestyle: 2.4.0
15489
-
15490
15449
  zova-module-a-openapi@5.1.51:
15491
15450
  dependencies:
15492
15451
  '@cabloy/json-schema-to-zod': 2.6.5
@@ -15565,48 +15524,10 @@ snapshots:
15565
15524
 
15566
15525
  zova-module-pay-mock@5.0.5: {}
15567
15526
 
15568
- zova-module-rest-resource@5.1.46: {}
15569
-
15570
- zova-module-rest-resource@5.1.47: {}
15571
-
15572
15527
  zova-module-rest-resource@5.1.49: {}
15573
15528
 
15574
15529
  zova-module-rest-resource@5.1.50: {}
15575
15530
 
15576
- zova-suite-a-zova@5.1.153(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)):
15577
- dependencies:
15578
- zova-module-a-api: 5.1.22
15579
- zova-module-a-app: 5.1.26
15580
- zova-module-a-bean: 5.1.33
15581
- zova-module-a-behavior: 5.1.26
15582
- zova-module-a-behaviors: 5.1.22
15583
- zova-module-a-boundary: 5.1.22
15584
- zova-module-a-command: 5.1.34
15585
- zova-module-a-fetch: 5.1.25
15586
- zova-module-a-form: 5.1.50(vue@3.5.39(typescript@5.9.3))
15587
- zova-module-a-icon: 5.1.27
15588
- zova-module-a-interceptor: 5.1.31
15589
- zova-module-a-logger: 5.1.28
15590
- zova-module-a-meta: 5.1.22
15591
- zova-module-a-model: 5.1.36(vue@3.5.39(typescript@5.9.3))
15592
- zova-module-a-openapi: 5.1.51
15593
- zova-module-a-router: 5.1.34
15594
- zova-module-a-routerstack: 5.1.27
15595
- zova-module-a-routertabs: 5.1.34
15596
- zova-module-a-ssr: 5.1.38
15597
- zova-module-a-ssrhmr: 5.1.23
15598
- zova-module-a-ssrserver: 5.1.26
15599
- zova-module-a-style: 5.1.35
15600
- zova-module-a-table: 5.1.38(vue@3.5.39(typescript@5.9.3))
15601
- zova-module-a-zod: 5.1.37
15602
- zova-module-a-zova: 5.1.103(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))
15603
- transitivePeerDependencies:
15604
- - '@vue/composition-api'
15605
- - debug
15606
- - supports-color
15607
- - typescript
15608
- - vue
15609
-
15610
15531
  zova-suite-a-zova@5.1.154(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)):
15611
15532
  dependencies:
15612
15533
  zova-module-a-api: 5.1.22
@@ -15617,13 +15538,13 @@ snapshots:
15617
15538
  zova-module-a-boundary: 5.1.22
15618
15539
  zova-module-a-command: 5.1.34
15619
15540
  zova-module-a-fetch: 5.1.25
15620
- zova-module-a-form: 5.1.50(vue@3.5.39(typescript@5.9.3))
15541
+ zova-module-a-form: 5.1.51(vue@3.5.39(typescript@5.9.3))
15621
15542
  zova-module-a-icon: 5.1.27
15622
15543
  zova-module-a-interceptor: 5.1.31
15623
15544
  zova-module-a-logger: 5.1.28
15624
15545
  zova-module-a-meta: 5.1.22
15625
15546
  zova-module-a-model: 5.1.36(vue@3.5.39(typescript@5.9.3))
15626
- zova-module-a-openapi: 5.1.51
15547
+ zova-module-a-openapi: 5.1.52
15627
15548
  zova-module-a-router: 5.1.34
15628
15549
  zova-module-a-routerstack: 5.1.27
15629
15550
  zova-module-a-routertabs: 5.1.34
@@ -15631,7 +15552,7 @@ snapshots:
15631
15552
  zova-module-a-ssrhmr: 5.1.23
15632
15553
  zova-module-a-ssrserver: 5.1.26
15633
15554
  zova-module-a-style: 5.1.35
15634
- zova-module-a-table: 5.1.38(vue@3.5.39(typescript@5.9.3))
15555
+ zova-module-a-table: 5.1.39(vue@3.5.39(typescript@5.9.3))
15635
15556
  zova-module-a-zod: 5.1.37
15636
15557
  zova-module-a-zova: 5.1.103(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))
15637
15558
  transitivePeerDependencies:
@@ -15675,17 +15596,6 @@ snapshots:
15675
15596
  - typescript
15676
15597
  - vue
15677
15598
 
15678
- zova@5.1.154(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)):
15679
- dependencies:
15680
- zova-core: 5.1.88(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3)
15681
- zova-suite-a-zova: 5.1.153(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))
15682
- transitivePeerDependencies:
15683
- - '@vue/composition-api'
15684
- - debug
15685
- - supports-color
15686
- - typescript
15687
- - vue
15688
-
15689
15599
  zova@5.1.155(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)):
15690
15600
  dependencies:
15691
15601
  zova-core: 5.1.88(patch_hash=144450bd7a567a6067e5857c0cf4c780981b7e90bc48745c09e1696a9b6f1b97)(typescript@5.9.3)
@@ -1,238 +0,0 @@
1
- # Instructions
2
-
3
- - Following Playwright test failed.
4
- - Explain why, be concise, respect Playwright best practices.
5
- - Provide a snippet of code with the fix, if possible.
6
-
7
- # Test info
8
-
9
- - Name: a-commerce.spec.ts >> ATP-ADDR-01: authenticated customer manages Address through Web self-service
10
- - Location: repo-e2e/specs/a-commerce.spec.ts:556:1
11
-
12
- # Error details
13
-
14
- ```
15
- Error: expect(page).toHaveURL(expected) failed
16
-
17
- Expected pattern: /\/commerce\/commerce\/member\/address(?:\?|$)/
18
- Received string: "http://127.0.0.1:7102/commerce/home/base/errorAccessDenied"
19
- Timeout: 5000ms
20
-
21
- Call log:
22
- - Expect "toHaveURL" with timeout 5000ms
23
- 14 × locator resolved to <html lang="en-us" data-zova-hydrated="commerce">…</html>
24
- - unexpected value "http://127.0.0.1:7102/commerce/home/base/errorAccessDenied"
25
-
26
- ```
27
-
28
- ```yaml
29
- - text: 403 Access denied.
30
- - button "Go Home"
31
- ```
32
-
33
- # Test source
34
-
35
- ```ts
36
- 89 | await expect(passwordInput).toHaveValue(password);
37
- 90 | await expect(page.getByPlaceholder('Please input captcha')).not.toHaveValue('');
38
- 91 | const loginResponse = waitForApiResponse(page, 'POST', '/api/home/user/passport/login');
39
- 92 | await page.getByRole('button', { name: 'Login', exact: true }).click();
40
- 93 | const loginResponseValue = await loginResponse;
41
- 94 | if (!loginResponseValue.ok()) {
42
- 95 | throw new Error(
43
- 96 | `login failed: ${loginResponseValue.status()} ${await loginResponseValue.text()}`,
44
- 97 | );
45
- 98 | }
46
- 99 | await expect(page).not.toHaveURL(/\/login(?:\?|$)/);
47
- 100 | }
48
- 101 | }
49
- 102 |
50
- 103 | async function registerCustomer(
51
- 104 | request: APIRequestContext,
52
- 105 | testInfo: TestInfo,
53
- 106 | ): Promise<{ password: string; username: string }> {
54
- 107 | const id = `${testInfo.workerIndex}-${testInfo.parallelIndex ?? testInfo.retry}-${Date.now()}`;
55
- 108 | const username = `e2e-address-${id}`;
56
- 109 | const password = 'address-e2e-password';
57
- 110 | const captchaResponse = await request.post('/api/captcha/create', {
58
- 111 | data: { scene: 'captcha-simple:simple' },
59
- 112 | });
60
- 113 | expect(captchaResponse.ok()).toBeTruthy();
61
- 114 | const captcha = (await captchaResponse.json()).data;
62
- 115 | expect(captcha?.id).toEqual(expect.any(String));
63
- 116 | expect(captcha?.token).toEqual(expect.any(String));
64
- 117 |
65
- 118 | const baseURL = testInfo.project.use.baseURL;
66
- 119 | if (!baseURL) throw new Error('commerce E2E base URL is unavailable');
67
- 120 | const consumerUrl = new URL('/home/user/activation', baseURL).toString();
68
- 121 | const registerResponse = await request.post('/api/home/user/passport/register', {
69
- 122 | data: {
70
- 123 | username,
71
- 124 | email: `${username}@example.test`,
72
- 125 | password,
73
- 126 | passwordConfirm: password,
74
- 127 | consumerUrl,
75
- 128 | captcha: { id: captcha.id, token: captcha.token },
76
- 129 | },
77
- 130 | });
78
- 131 | expect(registerResponse.ok()).toBeTruthy();
79
- 132 | const registration = (await registerResponse.json()).data;
80
- 133 | expect(registration?.jwt?.accessToken).toEqual(expect.any(String));
81
- 134 | const activateResponse = await request.post(passportTestActivateCurrentPath, {
82
- 135 | headers: { Authorization: `Bearer ${registration.jwt.accessToken}` },
83
- 136 | });
84
- 137 | expect(activateResponse.ok()).toBeTruthy();
85
- 138 | return { username, password };
86
- 139 | }
87
- 140 |
88
- 141 | function createAddressFixture(testInfo: TestInfo): IAddressFixture {
89
- 142 | const id = `${testInfo.workerIndex}-${testInfo.parallelIndex ?? testInfo.retry}-${Date.now()}`;
90
- 143 | return {
91
- 144 | recipientName: `E2E Address ${id}`,
92
- 145 | phone: '15555550123',
93
- 146 | countryCode: 'US',
94
- 147 | region: 'California',
95
- 148 | city: `Original City ${id}`,
96
- 149 | postalCode: '94105',
97
- 150 | addressLine1: `1 Test Street ${id}`,
98
- 151 | addressLine2: 'Suite E2E',
99
- 152 | updatedCity: `Updated City ${id}`,
100
- 153 | };
101
- 154 | }
102
- 155 |
103
- 156 | function getAddressTextbox(page: Page, name: string): Locator {
104
- 157 | return page.getByRole('group', { name, exact: true }).getByRole('textbox');
105
- 158 | }
106
- 159 |
107
- 160 | async function fillAddressForm(page: Page, fixture: IAddressFixture) {
108
- 161 | await getAddressTextbox(page, 'Recipient Name *').fill(fixture.recipientName);
109
- 162 | await getAddressTextbox(page, 'Phone *').fill(fixture.phone);
110
- 163 | await getAddressTextbox(page, 'Country Code *').fill(fixture.countryCode);
111
- 164 | await getAddressTextbox(page, 'Region *').fill(fixture.region);
112
- 165 | await getAddressTextbox(page, 'City *').fill(fixture.city);
113
- 166 | await getAddressTextbox(page, 'Postal Code *').fill(fixture.postalCode);
114
- 167 | await getAddressTextbox(page, 'Address Line 1 *').fill(fixture.addressLine1);
115
- 168 | await getAddressTextbox(page, 'Address Line 2').fill(fixture.addressLine2);
116
- 169 | }
117
- 170 |
118
- 171 | async function createAddressThroughCustomerPage(
119
- 172 | browser: Browser,
120
- 173 | request: APIRequestContext,
121
- 174 | testInfo: TestInfo,
122
- 175 | ) {
123
- 176 | const customer = await registerCustomer(request, testInfo);
124
- 177 | const fixture = createAddressFixture(testInfo);
125
- 178 | const context = await browser.newContext();
126
- 179 | const page = await context.newPage();
127
- 180 | const pageErrors = collectPageErrors(page);
128
- 181 |
129
- 182 | await login(
130
- 183 | page,
131
- 184 | '/commerce/commerce/member/address',
132
- 185 | customer.username,
133
- 186 | customer.password,
134
- 187 | 'commerce',
135
- 188 | );
136
- > 189 | await expect(page).toHaveURL(/\/commerce\/commerce\/member\/address(?:\?|$)/);
137
- | ^ Error: expect(page).toHaveURL(expected) failed
138
- 190 | await expect(page.getByRole('heading', { name: 'Addresses' })).toBeVisible();
139
- 191 | await expect(page.getByText('No addresses yet.')).toBeVisible();
140
- 192 |
141
- 193 | await fillAddressForm(page, fixture);
142
- 194 | const createResponse = waitForAddressResponse(page, 'POST', `${addressActionPath}/createMine`);
143
- 195 | const mineResponse = waitForAddressMine(page);
144
- 196 | await page.getByRole('button', { name: 'Save address', exact: true }).click();
145
- 197 | await createResponse;
146
- 198 | await mineResponse;
147
- 199 | await expect(page.getByRole('heading', { name: fixture.recipientName })).toBeVisible();
148
- 200 |
149
- 201 | return { context, fixture, page, pageErrors };
150
- 202 | }
151
- 203 |
152
- 204 | async function deleteAddressThroughCustomerPage(page: Page, fixture: IAddressFixture) {
153
- 205 | const card = page
154
- 206 | .locator('article')
155
- 207 | .filter({ has: page.getByRole('heading', { name: fixture.recipientName }) });
156
- 208 | const deleteResponse = waitForAddressResponse(page, 'DELETE', /\/deleteMine\/[^/]+$/);
157
- 209 | const mineResponse = waitForAddressMine(page);
158
- 210 | await card.getByRole('button', { name: 'Delete', exact: true }).click();
159
- 211 | await deleteResponse;
160
- 212 | await mineResponse;
161
- 213 | await expect(page.getByRole('heading', { name: fixture.recipientName })).toHaveCount(0);
162
- 214 | await expect(page.getByText('No addresses yet.')).toBeVisible();
163
- 215 | }
164
- 216 |
165
- 217 | test(
166
- 218 | 'ATP-SSR-01: anonymous Commerce HTML is public and hydration completes',
167
- 219 | { tag: ['@web', '@smoke'] },
168
- 220 | async ({ page, request }) => {
169
- 221 | const response = await request.get('/commerce');
170
- 222 | expect(response.ok()).toBeTruthy();
171
- 223 | expect(response.headers()['cache-control']).toBe('no-cache, no-store, must-revalidate');
172
- 224 | const html = await response.text();
173
- 225 | const normalizedHtml = html.toLowerCase();
174
- 226 | expect(normalizedHtml).not.toContain('data-zova-hydrated');
175
- 227 |
176
- 228 | for (const marker of privateMarkers) {
177
- 229 | expect(normalizedHtml).not.toContain(`"${marker}"`);
178
- 230 | }
179
- 231 |
180
- 232 | const pageErrors = collectPageErrors(page);
181
- 233 | const documentResponse = await page.goto('/commerce', { waitUntil: 'load' });
182
- 234 | expect(documentResponse?.ok()).toBeTruthy();
183
- 235 | await expect(page).toHaveURL(/\/commerce(?:\/|$)/);
184
- 236 | await expect(page.locator('html')).toHaveAttribute('data-zova-hydrated', 'commerce');
185
- 237 | await expect(page.getByRole('heading', { name: 'Commerce catalogue' })).toBeVisible();
186
- 238 | await expect(page.getByText('Dashboard')).toHaveCount(0);
187
- 239 | await expect(page.locator('body')).toBeVisible();
188
- 240 | await expect(page).not.toHaveTitle(/error/i);
189
- 241 | expect(pageErrors).toEqual([]);
190
- 242 | },
191
- 243 | );
192
- 244 |
193
- 245 | test(
194
- 246 | 'Commerce theme: public local preference mirrors session cookie without hydration mismatch',
195
- 247 | { tag: ['@web', '@ssr', '@theme'] },
196
- 248 | async ({ browser, request }, testInfo) => {
197
- 249 | const customer = await registerCustomer(request, testInfo);
198
- 250 | const context = await browser.newContext();
199
- 251 | await context.addInitScript(() => localStorage.setItem('themedark', 'true'));
200
- 252 | const page = await context.newPage();
201
- 253 | const pageErrors = collectPageErrors(page);
202
- 254 | const consoleErrors: string[] = [];
203
- 255 | page.on('console', message => {
204
- 256 | if (message.type() === 'error' || /hydration mismatch/i.test(message.text())) {
205
- 257 | consoleErrors.push(message.text());
206
- 258 | }
207
- 259 | });
208
- 260 | try {
209
- 261 | await page.goto('/commerce', { waitUntil: 'load' });
210
- 262 | await page.evaluate(() => localStorage.setItem('themedark', 'true'));
211
- 263 | await page.reload({ waitUntil: 'load' });
212
- 264 | await expect(page.locator('html')).toHaveAttribute('data-zova-hydrated', 'commerce');
213
- 265 | await expect(page.locator('body')).toHaveAttribute('data-theme', 'dark');
214
- 266 | expect((await context.cookies()).find(cookie => cookie.name === 'themedark')?.value).toBe(
215
- 267 | 'true',
216
- 268 | );
217
- 269 |
218
- 270 | await login(
219
- 271 | page,
220
- 272 | '/commerce/commerce/member/address',
221
- 273 | customer.username,
222
- 274 | customer.password,
223
- 275 | 'commerce',
224
- 276 | );
225
- 277 | await expect(page.locator('html')).toHaveAttribute('data-zova-hydrated', 'commerce');
226
- 278 | await expect(page.locator('body')).toHaveAttribute('data-theme', 'dark');
227
- 279 | expect(pageErrors).toEqual([]);
228
- 280 | expect(consoleErrors).toEqual([]);
229
- 281 | } finally {
230
- 282 | await context.close();
231
- 283 | }
232
- 284 | },
233
- 285 | );
234
- 286 |
235
- 287 | test(
236
- 288 | 'Commerce theme: session cookie mirrors public local preference without hydration mismatch',
237
- 289 | { tag: ['@web', '@ssr', '@theme'] },
238
- ```