@adyen/bento-mcp 0.5.4 → 0.6.0

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.
@@ -328,3 +328,1453 @@ This file contains a list of all deprecated components, properties, and features
328
328
  - ../vue2/src/components/sidepanel/sidepanel.vue- 2.0.0
329
329
  - ../vue2/src/components/sidepanel/sidepanel.vue- );
330
330
  - ../vue2/src/components/sidepanel/sidepanel.vue- }
331
+
332
+ ---
333
+
334
+ # ESLint Deprecation Rules — Migration Guides
335
+
336
+ The following sections are extracted from the ESLint deprecation rule documentation.
337
+ Each rule includes affected components, migration examples, and correct replacements.
338
+
339
+ ---
340
+
341
+ # deprecation-bento-data-grid-cell-action-menu-item-handler
342
+
343
+ ## Description
344
+
345
+ The `handler` property on `BentoColumnCellActionMenuItem` objects (used in `menuData` arrays) is deprecated since
346
+ v2.0.0. Use `event` instead, which receives `(rowDataItem, columnKey)` parameters providing context about which row and
347
+ column triggered the action.
348
+
349
+ ## Options
350
+
351
+ | Option | Type | Default | Description |
352
+ | :------------ | :-------- | :------ | :------------------- |
353
+ | **`autofix`** | `boolean` | `false` | Enables auto-fixing. |
354
+
355
+ ## Rule Details
356
+
357
+ This rule detects `handler` properties on objects inside `menuData` arrays, both in `<template>` expressions and
358
+ `<script>` blocks.
359
+
360
+ ### ❌ Incorrect
361
+
362
+ ```javascript
363
+ const cellActions = [
364
+ {
365
+ menuData: [
366
+ {
367
+ text: 'Cancel payment',
368
+ handler: () => cancelPayment(),
369
+ },
370
+ ],
371
+ },
372
+ ];
373
+ ```
374
+
375
+ ### ✅ Correct
376
+
377
+ ```javascript
378
+ const cellActions = [
379
+ {
380
+ menuData: [
381
+ {
382
+ text: 'Cancel payment',
383
+ event: (rowDataItem, columnKey) => cancelPayment(rowDataItem),
384
+ },
385
+ ],
386
+ },
387
+ ];
388
+ ```
389
+
390
+ ---
391
+
392
+ # deprecation-bento-date-range-picker-has-actions-prop
393
+
394
+ ## Description
395
+
396
+ Manages the **temporary** `has-actions` prop on `bento-date-range-picker`.
397
+
398
+ The `has-actions` prop is a temporary opt-in flag for the new actions behavior. This rule helps teams adopt it during
399
+ the transition period, and later remove it once the behavior becomes the default.
400
+
401
+ ## Options
402
+
403
+ | Option | Type | Default | Description |
404
+ | :------------ | :-------------------- | :------ | :------------------------------------------------------------- |
405
+ | **`action`** | `'add'` \| `'remove'` | `'add'` | `add` reports missing `has-actions`. `remove` reports present. |
406
+ | **`autofix`** | `boolean` | `false` | Enables auto-fixing. |
407
+
408
+ ## Rule Details
409
+
410
+ ### Action: `add` (default)
411
+
412
+ Reports `bento-date-range-picker` instances that are **missing** the `has-actions` prop.
413
+
414
+ #### ❌ Incorrect
415
+
416
+ ```html
417
+ <bento-date-range-picker label="Pick" />
418
+ ```
419
+
420
+ #### ✅ Correct
421
+
422
+ ```html
423
+ <bento-date-range-picker has-actions label="Pick" />
424
+ ```
425
+
426
+ ### Action: `remove`
427
+
428
+ Reports `bento-date-range-picker` instances that **have** the `has-actions` prop, so it can be cleaned up once the
429
+ behavior becomes permanent.
430
+
431
+ #### ❌ Incorrect
432
+
433
+ ```html
434
+ <bento-date-range-picker has-actions label="Pick" />
435
+ ```
436
+
437
+ #### ✅ Correct
438
+
439
+ ```html
440
+ <bento-date-range-picker label="Pick" />
441
+ ```
442
+
443
+ ---
444
+
445
+ # deprecation-bento-dropdown-size-prop
446
+
447
+ ## Description
448
+
449
+ The `size` prop in the following components is deprecated:
450
+
451
+ - `bento-dropdown`
452
+
453
+ Only the `default` size is supported. Remove the `size` prop entirely.
454
+
455
+ ## Rule Details
456
+
457
+ This rule reports usages of the deprecated `size` prop.
458
+
459
+ ### ❌ Incorrect
460
+
461
+ ```html
462
+ <bento-dropdown size="small" /> <bento-dropdown :size="BentoDropdownSize.SMALL" />
463
+ ```
464
+
465
+ ### ✅ Correct
466
+
467
+ ```html
468
+ <bento-dropdown />
469
+ ```
470
+
471
+ ---
472
+
473
+ # deprecation-bento-popover-modifiers-prop
474
+
475
+ ## Description
476
+
477
+ The `modifiers` prop in the following components is deprecated:
478
+
479
+ - `bento-popover`
480
+
481
+ ## Rule Details
482
+
483
+ This rule reports usages of the deprecated item.
484
+
485
+ ### ❌ Incorrect
486
+
487
+ ```html
488
+ <bento-popover modifiers="value" /> <bento-popover :modifiers="value" />
489
+ ```
490
+
491
+ ### ✅ Correct
492
+
493
+ ```html
494
+ <bento-popover />
495
+ ```
496
+
497
+ ---
498
+
499
+ # deprecation-bento-timeline-item-variant-prop
500
+
501
+ ## Description
502
+
503
+ The `variant` prop in `bento-timeline-item` is deprecated. Use `status` instead.
504
+
505
+ The `variant` prop accepted `BentoTimelineItemVariant` enum values (icon names), while `status` accepts color strings.
506
+ The autofix remaps values automatically:
507
+
508
+ | `variant` value | `status` value |
509
+ | ------------------------------- | -------------- |
510
+ | `SquareSmallIcon` / `DEFAULT` | `black` |
511
+ | `CheckedCircleIcon` / `SUCCESS` | `green` |
512
+ | `CrossCircleIcon` / `CRITICAL` | `red` |
513
+
514
+ > **Note:** If the variant value cannot be statically resolved (e.g. a variable reference), the autofix is skipped and
515
+ > only the deprecation warning is reported.
516
+
517
+ ## Rule Details
518
+
519
+ This rule reports usages of the deprecated `variant` prop and autofixes it to `status` with the correct color value.
520
+
521
+ ### ❌ Incorrect
522
+
523
+ ```html
524
+ <bento-timeline-item variant="CheckedCircleIcon" /> <bento-timeline-item :variant="BentoTimelineItemVariant.CRITICAL" />
525
+ ```
526
+
527
+ ### ✅ Correct
528
+
529
+ ```html
530
+ <bento-timeline-item status="green" /> <bento-timeline-item status="red" />
531
+ ```
532
+
533
+ ---
534
+
535
+ # deprecation-components-aria-label-prop
536
+
537
+ ## Description
538
+
539
+ The `ariaLabel` prop in the following components is deprecated:
540
+
541
+ - `bento-dropdown`
542
+ - `bento-input-field`
543
+ - `bento-pagination`
544
+ - `bento-popover`
545
+ - `bento-segmented-control`
546
+
547
+ Please use `aria-label` instead.
548
+
549
+ ## Rule Details
550
+
551
+ This rule reports usages of the deprecated `ariaLabel` prop (camelCase). The replacement `aria-label` is the native HTML
552
+ attribute, which the components already pick up via `attrs['aria-label']`.
553
+
554
+ ### ❌ Incorrect
555
+
556
+ ```html
557
+ <bento-dropdown ariaLabel="value" /> <bento-dropdown :ariaLabel="value" />
558
+ ```
559
+
560
+ ```html
561
+ <bento-input-field ariaLabel="value" /> <bento-input-field :ariaLabel="value" />
562
+ ```
563
+
564
+ ```html
565
+ <bento-pagination ariaLabel="value" /> <bento-pagination :ariaLabel="value" />
566
+ ```
567
+
568
+ ```html
569
+ <bento-popover ariaLabel="value" /> <bento-popover :ariaLabel="value" />
570
+ ```
571
+
572
+ ```html
573
+ <bento-segmented-control ariaLabel="value" /> <bento-segmented-control :ariaLabel="value" />
574
+ ```
575
+
576
+ ### ✅ Correct
577
+
578
+ ```html
579
+ <bento-dropdown aria-label="value" />
580
+ ```
581
+
582
+ ```html
583
+ <bento-input-field aria-label="value" />
584
+ ```
585
+
586
+ ```html
587
+ <bento-pagination aria-label="value" />
588
+ ```
589
+
590
+ ```html
591
+ <bento-popover aria-label="value" />
592
+ ```
593
+
594
+ ```html
595
+ <bento-segmented-control aria-label="value" />
596
+ ```
597
+
598
+ ---
599
+
600
+ # deprecation-components-error-prop
601
+
602
+ ## Description
603
+
604
+ The `error` prop in the following components is deprecated:
605
+
606
+ - `bento-dropdown`
607
+ - `bento-input-field`
608
+ - `bento-input-field-phone-number`
609
+
610
+ Please use `error-message` instead.
611
+
612
+ > **Note:** The `error` prop is a `boolean` that only toggles error styling, while `error-message` is a `string` that
613
+ > both displays a message and applies error styling. A direct rename is not type-safe — you must also update the bound
614
+ > value from a boolean to an error message string.
615
+
616
+ | Deprecated prop | Replacement prop | Type change |
617
+ | --------------- | ---------------- | -------------------- |
618
+ | `error` | `error-message` | `boolean` → `string` |
619
+
620
+ ## Rule Details
621
+
622
+ This rule reports usages of the deprecated `error` prop and provides an IDE suggestion (not an autofix) to rename it.
623
+
624
+ ### ❌ Incorrect
625
+
626
+ ```html
627
+ <!-- Static boolean -->
628
+ <bento-dropdown :error="true" :items="items" label="Country" />
629
+
630
+ <!-- Dynamic binding -->
631
+ <bento-dropdown :error="hasError" :items="items" label="Country" />
632
+ ```
633
+
634
+ ```html
635
+ <bento-input-field :error="true" label="Email" />
636
+
637
+ <bento-input-field :error="hasError" label="Email" />
638
+ ```
639
+
640
+ ```html
641
+ <bento-input-field-phone-number :error="true" label="Phone number" />
642
+
643
+ <bento-input-field-phone-number :error="hasError" label="Phone number" />
644
+ ```
645
+
646
+ ### ✅ Correct
647
+
648
+ ```html
649
+ <!-- Static error message -->
650
+ <bento-dropdown error-message="Please select a country" :items="items" label="Country" />
651
+
652
+ <!-- Dynamic error message driven by validation -->
653
+ <bento-dropdown :error-message="errorMessage" :items="items" label="Country" />
654
+ ```
655
+
656
+ ```html
657
+ <bento-input-field error-message="Enter a valid email address" label="Email" />
658
+
659
+ <bento-input-field :error-message="errorMessage" label="Email" />
660
+ ```
661
+
662
+ ```html
663
+ <bento-input-field-phone-number error-message="Enter a valid phone number" label="Phone number" />
664
+
665
+ <bento-input-field-phone-number :error-message="errorMessage" label="Phone number" />
666
+ ```
667
+
668
+ ## Migration Examples
669
+
670
+ ### Before — static boolean on `bento-dropdown`
671
+
672
+ ```html
673
+ <template>
674
+ <bento-dropdown :error="true" :items="items" label="Country" />
675
+ </template>
676
+ ```
677
+
678
+ ### After — static error message on `bento-dropdown`
679
+
680
+ ```html
681
+ <template>
682
+ <bento-dropdown error-message="Please select a country" :items="items" label="Country" />
683
+ </template>
684
+ ```
685
+
686
+ ### Before — dynamic validation on `bento-input-field`
687
+
688
+ ```html
689
+ <template>
690
+ <bento-input-field :error="hasError" v-model="email" label="Email" />
691
+ </template>
692
+
693
+ <script setup lang="ts">
694
+ const email = ref('');
695
+ const hasError = ref(false);
696
+
697
+ const validate = () => {
698
+ hasError.value = !email.value.includes('@');
699
+ };
700
+ </script>
701
+ ```
702
+
703
+ ### After — dynamic validation with error message on `bento-input-field`
704
+
705
+ ```html
706
+ <template>
707
+ <bento-input-field :error-message="errorMessage" v-model="email" label="Email" />
708
+ </template>
709
+
710
+ <script setup lang="ts">
711
+ const email = ref('');
712
+ const errorMessage = ref<string | null>(null);
713
+
714
+ const validate = () => {
715
+ errorMessage.value = !email.value.includes('@') ? 'Enter a valid email address' : null;
716
+ };
717
+ </script>
718
+ ```
719
+
720
+ ### Before — phone number validation
721
+
722
+ ```html
723
+ <template>
724
+ <bento-input-field-phone-number
725
+ :error="hasError"
726
+ v-model="phone"
727
+ :selected-country="country"
728
+ label="Phone number"
729
+ @input:valid="onValid"
730
+ @blur="validate"
731
+ />
732
+ </template>
733
+
734
+ <script setup lang="ts">
735
+ const phone = ref('');
736
+ const country = ref('US');
737
+ const hasError = ref(false);
738
+ const isValid = ref(false);
739
+
740
+ const onValid = (validity: boolean) => {
741
+ isValid.value = validity;
742
+ };
743
+
744
+ const validate = () => {
745
+ hasError.value = !isValid.value && !!phone.value;
746
+ };
747
+ </script>
748
+ ```
749
+
750
+ ### After — phone number validation with error message
751
+
752
+ ```html
753
+ <template>
754
+ <bento-input-field-phone-number
755
+ :error-message="errorMessage"
756
+ v-model="phone"
757
+ :selected-country="country"
758
+ label="Phone number"
759
+ @input:valid="onValid"
760
+ @blur="validate"
761
+ />
762
+ </template>
763
+
764
+ <script setup lang="ts">
765
+ const phone = ref('');
766
+ const country = ref('US');
767
+ const errorMessage = ref<string | null>(null);
768
+ const isValid = ref(false);
769
+
770
+ const onValid = (validity: boolean) => {
771
+ isValid.value = validity;
772
+ };
773
+
774
+ const validate = () => {
775
+ errorMessage.value = !isValid.value && !!phone.value ? 'Enter a valid phone number' : null;
776
+ };
777
+ </script>
778
+ ```
779
+
780
+ ---
781
+
782
+ # deprecation-components-has-error-prop
783
+
784
+ ## Description
785
+
786
+ The `hasError` prop in the following components is deprecated:
787
+
788
+ - `bento-checkbox-group`
789
+ - `bento-radio-group`
790
+
791
+ Please use `error-message` instead.
792
+
793
+ > **Note:** The `has-error` prop is a `boolean` that only toggles error styling, while `error-message` is a `string`
794
+ > that both displays a message and applies error styling. A direct rename is not type-safe — you must also update the
795
+ > bound value from a boolean to an error message string.
796
+
797
+ | Deprecated prop | Replacement prop | Type change |
798
+ | --------------- | ---------------- | -------------------- |
799
+ | `has-error` | `error-message` | `boolean` → `string` |
800
+
801
+ ## Rule Details
802
+
803
+ This rule reports usages of the deprecated `has-error` prop and provides an IDE suggestion (not an autofix) to rename
804
+ it.
805
+
806
+ ### ❌ Incorrect
807
+
808
+ ```html
809
+ <!-- Static boolean -->
810
+ <bento-checkbox-group :has-error="true" :items="items" label="Permissions" />
811
+
812
+ <!-- Dynamic binding -->
813
+ <bento-checkbox-group :has-error="hasError" :items="items" label="Permissions" />
814
+ ```
815
+
816
+ ```html
817
+ <bento-radio-group :has-error="true" :items="items" label="Priority" />
818
+
819
+ <bento-radio-group :has-error="hasError" :items="items" label="Priority" />
820
+ ```
821
+
822
+ ### ✅ Correct
823
+
824
+ ```html
825
+ <!-- Group-level error: pass a string message to error-message -->
826
+ <bento-checkbox-group error-message="Select at least one option" :items="items" label="Permissions" />
827
+
828
+ <!-- Dynamic error message driven by validation -->
829
+ <bento-checkbox-group :error-message="errorMessage" :items="items" label="Permissions" />
830
+ ```
831
+
832
+ ```html
833
+ <bento-radio-group error-message="Please select an option" :items="items" label="Priority" />
834
+
835
+ <bento-radio-group :error-message="errorMessage" :items="items" label="Priority" />
836
+ ```
837
+
838
+ ## Migration Examples
839
+
840
+ ### Before — static boolean
841
+
842
+ ```html
843
+ <template>
844
+ <bento-checkbox-group :has-error="true" :items="items" label="Toppings" />
845
+ </template>
846
+ ```
847
+
848
+ ### After — static error message
849
+
850
+ ```html
851
+ <template>
852
+ <bento-checkbox-group error-message="Select at least one topping" :items="items" label="Toppings" />
853
+ </template>
854
+ ```
855
+
856
+ ### Before — dynamic validation
857
+
858
+ ```html
859
+ <template>
860
+ <bento-checkbox-group :has-error="hasError" :items="items" label="Toppings" />
861
+ </template>
862
+
863
+ <script setup lang="ts">
864
+ const hasError = ref(false);
865
+
866
+ const validate = () => {
867
+ hasError.value = selectedToppings.value.length === 0;
868
+ };
869
+ </script>
870
+ ```
871
+
872
+ ### After — dynamic validation with error message
873
+
874
+ ```html
875
+ <template>
876
+ <bento-checkbox-group :error-message="errorMessage" :items="items" label="Toppings" />
877
+ </template>
878
+
879
+ <script setup lang="ts">
880
+ const errorMessage = ref<string | null>(null);
881
+
882
+ const validate = () => {
883
+ errorMessage.value = selectedToppings.value.length === 0 ? 'Select at least one topping' : null;
884
+ };
885
+ </script>
886
+ ```
887
+
888
+ ### Before — item-level `hasError`
889
+
890
+ ```html
891
+ <template>
892
+ <bento-checkbox-group :items="items" label="Permissions" />
893
+ </template>
894
+
895
+ <script setup lang="ts">
896
+ const items = [
897
+ { value: 'read', label: 'Read', hasError: true },
898
+ { value: 'write', label: 'Write' },
899
+ ];
900
+ </script>
901
+ ```
902
+
903
+ ### After — item-level `errorMessage`
904
+
905
+ ```html
906
+ <template>
907
+ <bento-checkbox-group :items="items" label="Permissions" />
908
+ </template>
909
+
910
+ <script setup lang="ts">
911
+ const items = [
912
+ { value: 'read', label: 'Read', errorMessage: 'Read permission is required' },
913
+ { value: 'write', label: 'Write' },
914
+ ];
915
+ </script>
916
+ ```
917
+
918
+ ---
919
+
920
+ # deprecation-components-input-emit
921
+
922
+ ## Description
923
+
924
+ The `@input` event listener in the following components is deprecated:
925
+
926
+ - `bento-date-picker`
927
+ - `bento-date-range-picker`
928
+ - `bento-dropdown`
929
+ - `bento-dropdown-avatar`
930
+ - `bento-dropdown-country`
931
+ - `bento-dropdown-currency`
932
+ - `bento-dropdown-payment-method`
933
+ - `bento-dropdown-tag`
934
+ - `bento-file-uploader`
935
+ - `bento-input-field`
936
+ - `bento-input-field-password`
937
+ - `bento-input-field-phone-number`
938
+ - `bento-checkbox-group`
939
+ - `bento-radio-group`
940
+ - `bento-selection-card-group`
941
+ - `bento-textarea`
942
+
943
+ Please use `@update:model-value` instead.
944
+
945
+ | Deprecated event | Replacement event | Autofix available |
946
+ | ---------------- | --------------------- | -------------------------- |
947
+ | `@input` | `@update:model-value` | Yes (opt-in via `autofix`) |
948
+
949
+ > **⚠️ Caveat — `v-model` combined with `@input`**
950
+ >
951
+ > Bento Vue 2 components emit **both** `input` (deprecated) and `update:model-value` on every value change for backward
952
+ > compatibility. In Vue 2, `v-model` internally listens to `@input`. If you autofix `@input` to `@update:model-value`
953
+ > while keeping `v-model`, you end up with `v-model` listening to `@input` **and** an explicit `@update:model-value`
954
+ > handler — both of which fire on every change. This causes race conditions because the handler may read the model value
955
+ > before `v-model`'s `@input` listener has propagated the update.
956
+ >
957
+ > In this case, **do not rely on autofix alone**. You must also replace `v-model` with an explicit `:model-value`
958
+ > binding so that a single `@update:model-value` handler controls both the model update and any side effects. See the
959
+ > [Migration Examples](#migration-examples) below.
960
+
961
+ ## Rule Details
962
+
963
+ This rule reports usages of the deprecated `@input` event and can optionally autofix them to `@update:model-value`.
964
+ Autofix is disabled by default and can be enabled with the `autofix` option.
965
+
966
+ ### ❌ Incorrect
967
+
968
+ ```html
969
+ <bento-date-picker @input="handler" />
970
+ ```
971
+
972
+ ```html
973
+ <bento-date-range-picker @input="handler" />
974
+ ```
975
+
976
+ ```html
977
+ <bento-dropdown @input="handler" />
978
+ ```
979
+
980
+ ```html
981
+ <bento-dropdown-avatar @input="handler" />
982
+ ```
983
+
984
+ ```html
985
+ <bento-dropdown-country @input="handler" />
986
+ ```
987
+
988
+ ```html
989
+ <bento-dropdown-currency @input="handler" />
990
+ ```
991
+
992
+ ```html
993
+ <bento-dropdown-payment-method @input="handler" />
994
+ ```
995
+
996
+ ```html
997
+ <bento-dropdown-tag @input="handler" />
998
+ ```
999
+
1000
+ ```html
1001
+ <bento-file-uploader @input="handler" />
1002
+ ```
1003
+
1004
+ ```html
1005
+ <bento-input-field @input="handler" />
1006
+ ```
1007
+
1008
+ ```html
1009
+ <bento-input-field-password @input="handler" />
1010
+ ```
1011
+
1012
+ ```html
1013
+ <bento-input-field-phone-number @input="handler" />
1014
+ ```
1015
+
1016
+ ```html
1017
+ <bento-checkbox-group @input="handler" />
1018
+ ```
1019
+
1020
+ ```html
1021
+ <bento-radio-group @input="handler" />
1022
+ ```
1023
+
1024
+ ```html
1025
+ <bento-selection-card-group @input="handler" />
1026
+ ```
1027
+
1028
+ ```html
1029
+ <bento-textarea @input="handler" />
1030
+ ```
1031
+
1032
+ ```html
1033
+ <!-- v-on:input directive syntax is also reported -->
1034
+ <bento-input-field v-on:input="handler" />
1035
+ ```
1036
+
1037
+ ```html
1038
+ <!-- ⚠️ v-model + @input — autofix alone is NOT safe -->
1039
+ <bento-input-field v-model="email" @input="onEmailChange" />
1040
+
1041
+ <bento-dropdown v-model="country" @input="onCountryChange" :items="items" />
1042
+ ```
1043
+
1044
+ ### ✅ Correct
1045
+
1046
+ ```html
1047
+ <bento-date-picker @update:model-value="handler" />
1048
+ ```
1049
+
1050
+ ```html
1051
+ <bento-date-range-picker @update:model-value="handler" />
1052
+ ```
1053
+
1054
+ ```html
1055
+ <bento-dropdown @update:model-value="handler" />
1056
+ ```
1057
+
1058
+ ```html
1059
+ <bento-dropdown-avatar @update:model-value="handler" />
1060
+ ```
1061
+
1062
+ ```html
1063
+ <bento-dropdown-country @update:model-value="handler" />
1064
+ ```
1065
+
1066
+ ```html
1067
+ <bento-dropdown-currency @update:model-value="handler" />
1068
+ ```
1069
+
1070
+ ```html
1071
+ <bento-dropdown-payment-method @update:model-value="handler" />
1072
+ ```
1073
+
1074
+ ```html
1075
+ <bento-dropdown-tag @update:model-value="handler" />
1076
+ ```
1077
+
1078
+ ```html
1079
+ <bento-file-uploader @update:model-value="handler" />
1080
+ ```
1081
+
1082
+ ```html
1083
+ <bento-input-field @update:model-value="handler" />
1084
+ ```
1085
+
1086
+ ```html
1087
+ <bento-input-field-password @update:model-value="handler" />
1088
+ ```
1089
+
1090
+ ```html
1091
+ <bento-input-field-phone-number @update:model-value="handler" />
1092
+ ```
1093
+
1094
+ ```html
1095
+ <bento-checkbox-group @update:model-value="handler" />
1096
+ ```
1097
+
1098
+ ```html
1099
+ <bento-radio-group @update:model-value="handler" />
1100
+ ```
1101
+
1102
+ ```html
1103
+ <bento-selection-card-group @update:model-value="handler" />
1104
+ ```
1105
+
1106
+ ```html
1107
+ <bento-textarea @update:model-value="handler" />
1108
+ ```
1109
+
1110
+ ```html
1111
+ <!-- v-model without a separate handler — no change needed -->
1112
+ <bento-input-field v-model="email" />
1113
+ ```
1114
+
1115
+ ```html
1116
+ <!-- v-model + @input migrated: split v-model into explicit binding + handler -->
1117
+ <bento-input-field :model-value="email" @update:model-value="onEmailChange" />
1118
+
1119
+ <bento-dropdown :model-value="country" @update:model-value="onCountryChange" :items="items" />
1120
+ ```
1121
+
1122
+ ## Migration Examples
1123
+
1124
+ If `v-model` is used alongside `@input`, you must also replace `v-model` with `:model-value` — see Case 2. Otherwise,
1125
+ renaming `@input` to `@update:model-value` is sufficient — see Cases 1 and 3.
1126
+
1127
+ ### Case 1 — standalone `@input` (safe to autofix)
1128
+
1129
+ The simplest case: `@input` is used without `v-model`. Rename it to `@update:model-value`.
1130
+
1131
+ #### Before
1132
+
1133
+ ```html
1134
+ <template>
1135
+ <bento-dropdown @input="onSelect" :items="countries" label="Country" />
1136
+ </template>
1137
+
1138
+ <script setup lang="ts">
1139
+ const onSelect = (value: string) => {
1140
+ console.log('Selected:', value);
1141
+ };
1142
+ </script>
1143
+ ```
1144
+
1145
+ #### After
1146
+
1147
+ ```html
1148
+ <template>
1149
+ <bento-dropdown @update:model-value="onSelect" :items="countries" label="Country" />
1150
+ </template>
1151
+
1152
+ <script setup lang="ts">
1153
+ const onSelect = (value: string) => {
1154
+ console.log('Selected:', value);
1155
+ };
1156
+ </script>
1157
+ ```
1158
+
1159
+ ### Case 2 — `v-model` + `@input` (autofix NOT safe — requires manual split)
1160
+
1161
+ When `v-model` is used alongside `@input`, autofix alone will cause a dual-emission race condition. You must replace
1162
+ `v-model` with an explicit `:model-value` binding and merge the update logic into a single `@update:model-value`
1163
+ handler.
1164
+
1165
+ #### Before — `v-model` + `@input`
1166
+
1167
+ ```html
1168
+ <template>
1169
+ <bento-dropdown v-model="country" @input="onCountryChange" :items="countries" label="Country" />
1170
+ </template>
1171
+
1172
+ <script setup lang="ts">
1173
+ const country = ref('');
1174
+
1175
+ const onCountryChange = (value: string) => {
1176
+ fetchCities(value);
1177
+ };
1178
+ </script>
1179
+ ```
1180
+
1181
+ #### ❌ Broken — after autofix only (dual-emission race condition)
1182
+
1183
+ ```html
1184
+ <template>
1185
+ <!-- v-model internally listens to @input, while @update:model-value listens to the new event.
1186
+ The component emits BOTH events on every change, causing a race condition:
1187
+ onCountryChange may read `country` before v-model's @input handler has updated it. -->
1188
+ <bento-dropdown v-model="country" @update:model-value="onCountryChange" :items="countries" label="Country" />
1189
+ </template>
1190
+ ```
1191
+
1192
+ #### ✅ Correct — split `v-model` and merge handlers
1193
+
1194
+ Replace `v-model` with `:model-value` and merge the update logic into one handler:
1195
+
1196
+ ```html
1197
+ <template>
1198
+ <bento-dropdown :model-value="country" @update:model-value="onCountryChange" :items="countries" label="Country" />
1199
+ </template>
1200
+
1201
+ <script setup lang="ts">
1202
+ const country = ref('');
1203
+
1204
+ const onCountryChange = (value: string) => {
1205
+ country.value = value;
1206
+ fetchCities(value);
1207
+ };
1208
+ </script>
1209
+ ```
1210
+
1211
+ ### Case 3 — explicit `:model-value` + `@input` (safe to autofix)
1212
+
1213
+ When `:model-value` is already used instead of `v-model`, there is no dual-emission conflict. Rename `@input` to
1214
+ `@update:model-value`.
1215
+
1216
+ #### Before — `:model-value` + `@input`
1217
+
1218
+ ```html
1219
+ <template>
1220
+ <bento-checkbox-group :model-value="selected" @input="onSelect" :items="items" label="Toppings" />
1221
+ </template>
1222
+
1223
+ <script setup lang="ts">
1224
+ const selected = ref([]);
1225
+
1226
+ const onSelect = (value: string[]) => {
1227
+ selected.value = value;
1228
+ };
1229
+ </script>
1230
+ ```
1231
+
1232
+ #### After — rename to `@update:model-value`
1233
+
1234
+ ```html
1235
+ <template>
1236
+ <bento-checkbox-group :model-value="selected" @update:model-value="onSelect" :items="items" label="Toppings" />
1237
+ </template>
1238
+
1239
+ <script setup lang="ts">
1240
+ const selected = ref([]);
1241
+
1242
+ const onSelect = (value: string[]) => {
1243
+ selected.value = value;
1244
+ };
1245
+ </script>
1246
+ ```
1247
+
1248
+ ---
1249
+
1250
+ # deprecation-components-value-prop
1251
+
1252
+ ## Description
1253
+
1254
+ The `value` prop in the following components is deprecated:
1255
+
1256
+ - `bento-date-picker`
1257
+ - `bento-date-range-picker`
1258
+ - `bento-dropdown`
1259
+ - `bento-dropdown-avatar`
1260
+ - `bento-dropdown-country`
1261
+ - `bento-dropdown-currency`
1262
+ - `bento-dropdown-payment-method`
1263
+ - `bento-dropdown-tag`
1264
+ - `bento-file-uploader`
1265
+ - `bento-input-field`
1266
+ - `bento-input-field-password`
1267
+ - `bento-input-field-phone-number`
1268
+ - `bento-checkbox-group`
1269
+ - `bento-radio-group`
1270
+ - `bento-selection-card-group`
1271
+ - `bento-textarea`
1272
+
1273
+ Please use `model-value` instead.
1274
+
1275
+ ## Rule Details
1276
+
1277
+ This rule reports usages of the deprecated item.
1278
+
1279
+ ### ❌ Incorrect
1280
+
1281
+ ```html
1282
+ <bento-date-picker value="value" /> <bento-date-picker :value="value" />
1283
+ ```
1284
+
1285
+ ```html
1286
+ <bento-date-range-picker value="value" /> <bento-date-range-picker :value="value" />
1287
+ ```
1288
+
1289
+ ```html
1290
+ <bento-dropdown value="value" /> <bento-dropdown :value="value" />
1291
+ ```
1292
+
1293
+ ```html
1294
+ <bento-dropdown-avatar value="value" /> <bento-dropdown-avatar :value="value" />
1295
+ ```
1296
+
1297
+ ```html
1298
+ <bento-dropdown-country value="value" /> <bento-dropdown-country :value="value" />
1299
+ ```
1300
+
1301
+ ```html
1302
+ <bento-dropdown-currency value="value" /> <bento-dropdown-currency :value="value" />
1303
+ ```
1304
+
1305
+ ```html
1306
+ <bento-dropdown-payment-method value="value" /> <bento-dropdown-payment-method :value="value" />
1307
+ ```
1308
+
1309
+ ```html
1310
+ <bento-dropdown-tag value="value" /> <bento-dropdown-tag :value="value" />
1311
+ ```
1312
+
1313
+ ```html
1314
+ <bento-file-uploader value="value" /> <bento-file-uploader :value="value" />
1315
+ ```
1316
+
1317
+ ```html
1318
+ <bento-input-field value="value" /> <bento-input-field :value="value" />
1319
+ ```
1320
+
1321
+ ```html
1322
+ <bento-input-field-password value="value" /> <bento-input-field-password :value="value" />
1323
+ ```
1324
+
1325
+ ```html
1326
+ <bento-input-field-phone-number value="value" /> <bento-input-field-phone-number :value="value" />
1327
+ ```
1328
+
1329
+ ```html
1330
+ <bento-checkbox-group value="value" /> <bento-checkbox-group :value="value" />
1331
+ ```
1332
+
1333
+ ```html
1334
+ <bento-radio-group value="value" /> <bento-radio-group :value="value" />
1335
+ ```
1336
+
1337
+ ```html
1338
+ <bento-selection-card-group value="value" /> <bento-selection-card-group :value="value" />
1339
+ ```
1340
+
1341
+ ```html
1342
+ <bento-textarea value="value" /> <bento-textarea :value="value" />
1343
+ ```
1344
+
1345
+ ### ✅ Correct
1346
+
1347
+ ```html
1348
+ <bento-date-picker model-value="value" />
1349
+ ```
1350
+
1351
+ ```html
1352
+ <bento-date-range-picker model-value="value" />
1353
+ ```
1354
+
1355
+ ```html
1356
+ <bento-dropdown model-value="value" />
1357
+ ```
1358
+
1359
+ ```html
1360
+ <bento-dropdown-avatar model-value="value" />
1361
+ ```
1362
+
1363
+ ```html
1364
+ <bento-dropdown-country model-value="value" />
1365
+ ```
1366
+
1367
+ ```html
1368
+ <bento-dropdown-currency model-value="value" />
1369
+ ```
1370
+
1371
+ ```html
1372
+ <bento-dropdown-payment-method model-value="value" />
1373
+ ```
1374
+
1375
+ ```html
1376
+ <bento-dropdown-tag model-value="value" />
1377
+ ```
1378
+
1379
+ ```html
1380
+ <bento-file-uploader model-value="value" />
1381
+ ```
1382
+
1383
+ ```html
1384
+ <bento-input-field model-value="value" />
1385
+ ```
1386
+
1387
+ ```html
1388
+ <bento-input-field-password model-value="value" />
1389
+ ```
1390
+
1391
+ ```html
1392
+ <bento-input-field-phone-number model-value="value" />
1393
+ ```
1394
+
1395
+ ```html
1396
+ <bento-checkbox-group model-value="value" />
1397
+ ```
1398
+
1399
+ ```html
1400
+ <bento-radio-group model-value="value" />
1401
+ ```
1402
+
1403
+ ```html
1404
+ <bento-selection-card-group model-value="value" />
1405
+ ```
1406
+
1407
+ ```html
1408
+ <bento-textarea model-value="value" />
1409
+ ```
1410
+
1411
+ ---
1412
+
1413
+ # deprecation-country-custom-usage
1414
+
1415
+ ## Description
1416
+
1417
+ This rule deprecates the `variant="custom"` prop and custom `label` usage across country-related components.
1418
+ These features are being removed because country components should use built-in variants (`name`, `iso`, `capital`, `phone_code`) rather than custom labels.
1419
+
1420
+ The rule covers three components:
1421
+
1422
+ 1. **`bento-country`** — the `variant="custom"` prop and the `label` prop
1423
+ 2. **`bento-dropdown-country`** — the `variant="custom"` prop and `label` keys in the `:items` array
1424
+ 3. **`BentoFilterItemType.SELECT_COUNTRY`** — the `variant: 'custom'` option and `label` keys in `listboxItems`
1425
+
1426
+ ## Rule Details
1427
+
1428
+ ### `bento-country`
1429
+
1430
+ The `label` prop only takes effect when `variant="custom"` is set. Using either one alone is dead code.
1431
+
1432
+ #### ❌ Incorrect
1433
+
1434
+ ```html
1435
+ <!-- variant="custom" only — variant does nothing without a label -->
1436
+ <bento-country code="NL" variant="custom" />
1437
+
1438
+ <!-- label only — label is ignored without variant="custom" -->
1439
+ <bento-country code="NL" label="Custom label" />
1440
+
1441
+ <!-- both — deprecated, use bento-typography instead -->
1442
+ <bento-country code="NL" variant="custom" label="Custom label" />
1443
+ <bento-country code="NL" :variant="BentoCountryVariant.CUSTOM" :label="customLabel" />
1444
+ ```
1445
+
1446
+ #### ✅ Correct
1447
+
1448
+ ```html
1449
+ <!-- Use a built-in variant -->
1450
+ <bento-country code="NL" variant="name" />
1451
+
1452
+ <!-- Use bento-typography for custom text -->
1453
+ <bento-typography el="span">Custom label</bento-typography>
1454
+ ```
1455
+
1456
+ ### `bento-dropdown-country`
1457
+
1458
+ The `label` key in items is only used when `variant="custom"` is set. Using either one alone is dead code.
1459
+
1460
+ #### ❌ Incorrect
1461
+
1462
+ ```html
1463
+ <!-- label in items only — labels are ignored without variant="custom" -->
1464
+ <bento-dropdown-country :items="[{ value: 'NL', label: 'Custom label' }]" />
1465
+
1466
+ <!-- variant="custom" only — variant does nothing without labels in items -->
1467
+ <bento-dropdown-country :items="[{ value: 'NL' }]" variant="custom" />
1468
+
1469
+ <!-- both — deprecated, use bento-dropdown instead -->
1470
+ <bento-dropdown-country :items="[{ value: 'NL', label: 'Custom label' }]" variant="custom" />
1471
+ ```
1472
+
1473
+ #### ✅ Correct
1474
+
1475
+ ```html
1476
+ <!-- Use a built-in variant -->
1477
+ <bento-dropdown-country :items="[{ value: 'NL' }]" variant="name" />
1478
+
1479
+ <!-- Use bento-dropdown for custom labels -->
1480
+ <bento-dropdown :items="[{ value: 'NL', label: 'Custom label' }]" />
1481
+ ```
1482
+
1483
+ ### `SELECT_COUNTRY` filter config (`bento-filter-bar` / `bento-data-grid`)
1484
+
1485
+ The `label` key in `listboxItems` is only used when `variant: 'custom'` is set. Using either one alone is dead code.
1486
+
1487
+ #### ❌ Incorrect
1488
+
1489
+ ```html
1490
+ <!-- variant: 'custom' only -->
1491
+ <bento-filter-bar
1492
+ :config="[{
1493
+ field: 'country', label: 'Country',
1494
+ type: BentoFilterItemType.SELECT_COUNTRY,
1495
+ options: { listboxItems: [{ value: 'NL' }], variant: 'custom' }
1496
+ }]"
1497
+ />
1498
+
1499
+ <!-- label in listboxItems only -->
1500
+ <bento-filter-bar
1501
+ :config="[{
1502
+ field: 'country', label: 'Country',
1503
+ type: BentoFilterItemType.SELECT_COUNTRY,
1504
+ options: { listboxItems: [{ value: 'NL', label: 'Custom label' }] }
1505
+ }]"
1506
+ />
1507
+
1508
+ <!-- both -->
1509
+ <bento-filter-bar
1510
+ :config="[{
1511
+ field: 'country', label: 'Country',
1512
+ type: BentoFilterItemType.SELECT_COUNTRY,
1513
+ options: {
1514
+ listboxItems: [{ value: 'NL', label: 'Custom label' }],
1515
+ variant: 'custom'
1516
+ }
1517
+ }]"
1518
+ />
1519
+ ```
1520
+
1521
+ #### ✅ Correct
1522
+
1523
+ ```html
1524
+ <!-- Use a built-in variant -->
1525
+ <bento-filter-bar
1526
+ :config="[{
1527
+ field: 'country', label: 'Country',
1528
+ type: BentoFilterItemType.SELECT_COUNTRY,
1529
+ options: { listboxItems: [{ value: 'NL' }], variant: 'name' }
1530
+ }]"
1531
+ />
1532
+
1533
+ <!-- Use SELECT type for custom labels -->
1534
+ <bento-filter-bar
1535
+ :config="[{
1536
+ field: 'country', label: 'Country',
1537
+ type: BentoFilterItemType.SELECT,
1538
+ options: { listboxItems: [{ value: 'NL', label: 'Custom label' }] }
1539
+ }]"
1540
+ />
1541
+ ```
1542
+
1543
+ ## Autofix
1544
+
1545
+ Enable opt-in autofix via ESLint config:
1546
+
1547
+ ```js
1548
+ '@adyen/bento/deprecation-country-custom-usage': ['warn', { autofix: true }]
1549
+ ```
1550
+
1551
+ The autofix behavior depends on which deprecated props are present:
1552
+
1553
+ | Scenario | Autofix |
1554
+ |---|---|
1555
+ | `variant="custom"` only | Removes the `variant` prop/property |
1556
+ | `label` only | Removes the `label` prop/property |
1557
+ | Both `variant="custom"` + `label` | Full replacement (see below) |
1558
+
1559
+ ### Full replacement (both present)
1560
+
1561
+ - **`bento-country`** — replaces the entire element with `<bento-typography el="span">{{ label }}</bento-typography>`
1562
+ - **`bento-dropdown-country`** — renames the tag to `bento-dropdown` and removes the `variant` attribute
1563
+ - **`SELECT_COUNTRY` filter** — changes `type` to `BentoFilterItemType.SELECT` and removes `variant` from options
1564
+
1565
+ ---
1566
+
1567
+ # @adyen/bento/deprecation-currency-default-slot
1568
+
1569
+ > Disallow the use of the `default` slot in `bento-currency` instances
1570
+
1571
+ - This rule is included in the `plugin:@adyen/bento/recommended` configuration.
1572
+ - 🔧 The `--fix` option can automatically fix the problems reported by this rule.
1573
+
1574
+ This rule prevents using the deprecated `default` slot within the `Currency` component.
1575
+
1576
+ ## ✗ BAD
1577
+
1578
+ <!-- prettier-ignore -->
1579
+ ```html
1580
+ <template>
1581
+ <bento-currency currency="USD">
1582
+ 12345
1583
+ </bento-currency>
1584
+
1585
+ <bento-currency currency="USD">
1586
+ 12345.67
1587
+ </bento-currency>
1588
+
1589
+ <bento-currency>
1590
+ {{ thisIsMyVariableWithCurrencyValue }}
1591
+ </bento-currency>
1592
+ </template>
1593
+ ```
1594
+
1595
+ ## ✓ Good
1596
+
1597
+ <!-- prettier-ignore -->
1598
+ ```html
1599
+ <template>
1600
+ <bento-currency
1601
+ :value="12345"
1602
+ currency="USD"
1603
+ />
1604
+
1605
+ <bento-currency
1606
+ :value="12345.67"
1607
+ currency="USD"
1608
+ />
1609
+
1610
+ <bento-currency
1611
+ :value="thisIsMyVariableWithCurrencyValue"
1612
+ :currency="BentoCurrencyISOCode.USD"
1613
+ major-units
1614
+ />
1615
+ </template>
1616
+ ```
1617
+
1618
+ ---
1619
+
1620
+ # deprecation-filter-bar-deprecated-props
1621
+
1622
+ ## Description
1623
+
1624
+ Deprecates the following props and options in `bento-filter-bar` and `bento-data-grid` filter configs:
1625
+
1626
+ ### Direct prop on `bento-filter-bar`
1627
+
1628
+ | Deprecated | Replacement |
1629
+ | ---------- | ---------------------------- |
1630
+ | `value` | `config` and `filter-values` |
1631
+
1632
+ ### Nested options in filter config items (`BentoSelectFilterOptions`)
1633
+
1634
+ | Deprecated | Replacement |
1635
+ | --------------------------------------------------- | ------------------------------------------------- |
1636
+ | `messages` | None (persistent filter label now uses a counter) |
1637
+ | `messagesPersistentButtonLabelPartiallySelectedKey` | None |
1638
+ | `messagesPersistentButtonLabelAllSelectedKey` | None |
1639
+
1640
+ ### `value` on filter config items (`BentoFilterModel`)
1641
+
1642
+ | Deprecated | Replacement |
1643
+ | ---------- | --------------- |
1644
+ | `value` | `filter-values` |
1645
+
1646
+ ## Rule Details
1647
+
1648
+ ### ❌ Incorrect
1649
+
1650
+ ```html
1651
+ <bento-filter-bar :value="filters" /> <bento-filter-bar v-model="filters" />
1652
+ ```
1653
+
1654
+ ```js
1655
+ const config = [
1656
+ {
1657
+ field: 'status',
1658
+ type: 'BentoSelectFilter',
1659
+ value: 'active',
1660
+ options: {
1661
+ messages: { en: { persistentButtonLabelPartiallySelected: 'x' } },
1662
+ messagesPersistentButtonLabelPartiallySelectedKey: 'customKey',
1663
+ messagesPersistentButtonLabelAllSelectedKey: 'customKey',
1664
+ },
1665
+ },
1666
+ ];
1667
+ ```
1668
+
1669
+ ### ✅ Correct
1670
+
1671
+ ```html
1672
+ <bento-filter-bar :config="config" :filter-values="values" />
1673
+ ```
1674
+
1675
+ ```js
1676
+ const config = [
1677
+ {
1678
+ field: 'status',
1679
+ type: 'BentoSelectFilter',
1680
+ options: { listboxItems: [] },
1681
+ },
1682
+ ];
1683
+ ```
1684
+
1685
+ ---
1686
+
1687
+ # deprecation-input-filter-dropdown-options
1688
+
1689
+ Deprecates usage of `dropdown`, `dropdownPosition`, and `variant` properties inside `BentoInputFilterOptions`.
1690
+
1691
+ These properties were used to configure the input filter as a dropdown variant. They should be replaced by using
1692
+ `BentoFilterItemType.INPUT_DROPDOWN` instead of `BentoFilterItemType.INPUT`.
1693
+
1694
+ ## Examples
1695
+
1696
+ ### Invalid
1697
+
1698
+ ```vue
1699
+ <script setup>
1700
+ const config = [
1701
+ {
1702
+ field: 'name',
1703
+ label: 'Name',
1704
+ type: BentoFilterItemType.INPUT,
1705
+ options: { dropdown: { items: [] }, dropdownPosition: 'end', variant: 'dropdown' },
1706
+ },
1707
+ ];
1708
+ </script>
1709
+ <template>
1710
+ <bento-filter-bar :config="config" />
1711
+ </template>
1712
+ ```
1713
+
1714
+ ### Valid
1715
+
1716
+ ```vue
1717
+ <script setup>
1718
+ const config = [
1719
+ {
1720
+ field: 'name',
1721
+ label: 'Name',
1722
+ type: BentoFilterItemType.INPUT_DROPDOWN,
1723
+ options: { dropdown: { items: [] }, dropdownPosition: 'end' },
1724
+ },
1725
+ ];
1726
+ </script>
1727
+ <template>
1728
+ <bento-filter-bar :config="config" />
1729
+ </template>
1730
+ ```
1731
+
1732
+ ---
1733
+
1734
+ # @adyen/bento/deprecation-tag-default-slot
1735
+
1736
+ > Disallow the use of the slot in `bento-tag` instances
1737
+
1738
+ - This rule is included in the `plugin:@adyen/bento/recommended` configuration.
1739
+ - 🔧 The `--fix` option can automatically fix the problems reported by this rule.
1740
+
1741
+ This rule prevents using the deprecated `default` slot within the `Tag` component.
1742
+
1743
+ ## ✗ BAD
1744
+
1745
+ <!-- prettier-ignore -->
1746
+ ```html
1747
+ <template>
1748
+ <bento-tag variant="blue">
1749
+ Label text
1750
+ </bento-tag>
1751
+
1752
+ <bento-tag>
1753
+ Label text
1754
+ </bento-tag>
1755
+
1756
+ <bento-tag>
1757
+ {{ thisIsMyVariableWithText }}
1758
+ </bento-tag>
1759
+
1760
+ <bento-tag>
1761
+ Value: {{ thisIsAValue }}
1762
+ </bento-tag>
1763
+ </template>
1764
+ ```
1765
+
1766
+ ## ✓ Good
1767
+
1768
+ <!-- prettier-ignore -->
1769
+ ```html
1770
+ <template>
1771
+ <bento-tag label="Label text" variant="blue" />
1772
+
1773
+ <bento-tag label="Label text" variant="blue" />
1774
+
1775
+ <bento-tag :label="thisIsMyVariableWithText" variant="blue" />
1776
+
1777
+ <bento-tag :label="Value: ${thisIsAValue}" />
1778
+ </template>
1779
+ ```
1780
+