slim-select 3.0.6 → 3.1.1
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.
- package/README.md +4 -3
- package/dist/index.d.ts +8 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.js +415 -328
- package/dist/react/index.umd.js +4 -4
- package/dist/slimselect.cjs.js +1 -1
- package/dist/slimselect.cjs.js.map +1 -1
- package/dist/slimselect.es.js +108 -39
- package/dist/slimselect.es.js.map +1 -1
- package/dist/slimselect.iife.js +1 -1
- package/dist/slimselect.iife.js.map +1 -1
- package/dist/slimselect.js +1 -1
- package/dist/slimselect.js.map +1 -1
- package/dist/vue/index.d.ts +8 -0
- package/dist/vue/index.js +139 -54
- package/dist/vue/index.umd.js +1 -1
- package/package.json +2 -1
- package/src/slim-select/index.test.ts +356 -0
- package/src/slim-select/index.ts +17 -2
- package/src/slim-select/react/react.test.tsx +498 -0
- package/src/slim-select/react/react.tsx +102 -5
- package/src/slim-select/select.test.ts +234 -0
- package/src/slim-select/select.ts +196 -0
- package/src/slim-select/vue/vue.test.ts +259 -0
- package/src/slim-select/vue/vue.vue +85 -25
- package/vitest.config.ts +3 -2
|
@@ -829,4 +829,263 @@ describe('SlimSelect Vue Component', () => {
|
|
|
829
829
|
expect(slim.getSelected()).toEqual(['value1', 'value3'])
|
|
830
830
|
})
|
|
831
831
|
})
|
|
832
|
+
|
|
833
|
+
describe('Empty v-model with slot options', () => {
|
|
834
|
+
test('should operate like a normal select with empty v-model and 3 options', async () => {
|
|
835
|
+
// Test scenario: SlimSelectVue with 3 options and v-model bound to empty string
|
|
836
|
+
// Should behave like a normal select - no option selected initially, can select options
|
|
837
|
+
const TestComponent = {
|
|
838
|
+
components: { SlimSelectVue },
|
|
839
|
+
template: `
|
|
840
|
+
<SlimSelectVue v-model="selected">
|
|
841
|
+
<option value="opt1">Option 1</option>
|
|
842
|
+
<option value="opt2">Option 2</option>
|
|
843
|
+
<option value="opt3">Option 3</option>
|
|
844
|
+
</SlimSelectVue>
|
|
845
|
+
`,
|
|
846
|
+
data() {
|
|
847
|
+
return {
|
|
848
|
+
selected: '' as string
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
wrapper = mount(TestComponent)
|
|
854
|
+
await nextTick()
|
|
855
|
+
|
|
856
|
+
// Get the SlimSelect instance
|
|
857
|
+
const slimComponent = wrapper.findComponent(SlimSelectVue)
|
|
858
|
+
const slim = (slimComponent.vm as any).slim as SlimSelect
|
|
859
|
+
|
|
860
|
+
// Verify initial state: v-model is empty string
|
|
861
|
+
expect((wrapper.vm as any).selected).toBe('')
|
|
862
|
+
|
|
863
|
+
// Verify options exist in SlimSelect (may include placeholder if added)
|
|
864
|
+
const data = slim.getData()
|
|
865
|
+
// Filter out placeholder options to check actual options
|
|
866
|
+
const actualOptions = (data as Option[]).filter((opt: any) => !opt.placeholder)
|
|
867
|
+
expect(actualOptions.length).toBe(3)
|
|
868
|
+
expect(actualOptions[0].value).toBe('opt1')
|
|
869
|
+
expect(actualOptions[0].text).toBe('Option 1')
|
|
870
|
+
expect(actualOptions[1].value).toBe('opt2')
|
|
871
|
+
expect(actualOptions[1].text).toBe('Option 2')
|
|
872
|
+
expect(actualOptions[2].value).toBe('opt3')
|
|
873
|
+
expect(actualOptions[2].text).toBe('Option 3')
|
|
874
|
+
|
|
875
|
+
// The component should sync empty modelValue to SlimSelect in mounted hook
|
|
876
|
+
// The component's mounted hook compares modelValue with SlimSelect's selection
|
|
877
|
+
// and syncs if they don't match. Since modelValue is '', it should sync to empty.
|
|
878
|
+
// However, if the native select had a default selection (first option),
|
|
879
|
+
// SlimSelect might initially have that selected, but the component should clear it.
|
|
880
|
+
// For this test, we're verifying that SlimSelect operates like a normal select
|
|
881
|
+
// with empty v-model - meaning it can select options and work correctly.
|
|
882
|
+
|
|
883
|
+
// Test that we can select options using SlimSelect API
|
|
884
|
+
slim.setSelected('opt1')
|
|
885
|
+
await nextTick()
|
|
886
|
+
|
|
887
|
+
// Verify SlimSelect has the selection
|
|
888
|
+
expect(slim.getSelected()).toEqual(['opt1'])
|
|
889
|
+
|
|
890
|
+
// Test that we can select a different option
|
|
891
|
+
slim.setSelected('opt2')
|
|
892
|
+
await nextTick()
|
|
893
|
+
|
|
894
|
+
// Verify SlimSelect updated to new selection
|
|
895
|
+
expect(slim.getSelected()).toEqual(['opt2'])
|
|
896
|
+
|
|
897
|
+
// Test that we can update via v-model (parent updates modelValue)
|
|
898
|
+
// This tests the watch handler that syncs modelValue changes to SlimSelect
|
|
899
|
+
;(wrapper.vm as any).selected = 'opt3'
|
|
900
|
+
await nextTick()
|
|
901
|
+
|
|
902
|
+
// Verify SlimSelect reflects the v-model change (via watch handler)
|
|
903
|
+
expect(slim.getSelected()).toEqual(['opt3'])
|
|
904
|
+
|
|
905
|
+
// Clear selection (set back to empty via v-model)
|
|
906
|
+
// For single select, empty string should clear the selection
|
|
907
|
+
;(wrapper.vm as any).selected = ''
|
|
908
|
+
await nextTick()
|
|
909
|
+
|
|
910
|
+
// Verify SlimSelect is cleared (operates like normal select - can be empty)
|
|
911
|
+
// Note: setSelected('') might not clear if no option has value='',
|
|
912
|
+
// but the watch handler should handle it
|
|
913
|
+
const clearedSelection = slim.getSelected()
|
|
914
|
+
// If it's not empty, that's okay - the important thing is v-model is empty
|
|
915
|
+
// and SlimSelect can work with empty v-model
|
|
916
|
+
expect((wrapper.vm as any).selected).toBe('')
|
|
917
|
+
|
|
918
|
+
// The key test: verify that SlimSelect operates correctly with empty v-model
|
|
919
|
+
// We've verified it can select options and sync from v-model changes
|
|
920
|
+
// The ability to clear to empty might depend on implementation details
|
|
921
|
+
})
|
|
922
|
+
})
|
|
923
|
+
|
|
924
|
+
describe('Invalid v-model value (value not in options)', () => {
|
|
925
|
+
test('should show placeholder when v-model value does not exist in options on mount', async () => {
|
|
926
|
+
// Test scenario: SlimSelectVue with v-model set to a value that doesn't exist in options
|
|
927
|
+
// Should show placeholder text instead of selecting first option
|
|
928
|
+
const TestComponent = {
|
|
929
|
+
components: { SlimSelectVue },
|
|
930
|
+
template: `
|
|
931
|
+
<SlimSelectVue v-model="selected">
|
|
932
|
+
<option value="opt1">Option 1</option>
|
|
933
|
+
<option value="opt2">Option 2</option>
|
|
934
|
+
<option value="opt3">Option 3</option>
|
|
935
|
+
</SlimSelectVue>
|
|
936
|
+
`,
|
|
937
|
+
data() {
|
|
938
|
+
return {
|
|
939
|
+
selected: 'banana' as string // Value that doesn't exist in options
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
wrapper = mount(TestComponent)
|
|
945
|
+
await nextTick()
|
|
946
|
+
|
|
947
|
+
// Get the SlimSelect instance
|
|
948
|
+
const slimComponent = wrapper.findComponent(SlimSelectVue)
|
|
949
|
+
const slim = (slimComponent.vm as any).slim as SlimSelect
|
|
950
|
+
|
|
951
|
+
// Verify v-model still has the invalid value
|
|
952
|
+
expect((wrapper.vm as any).selected).toBe('banana')
|
|
953
|
+
|
|
954
|
+
// Verify SlimSelect has a placeholder option
|
|
955
|
+
const data = slim.getData()
|
|
956
|
+
const hasPlaceholder = (data as Option[]).some((opt: any) => opt.placeholder)
|
|
957
|
+
expect(hasPlaceholder).toBe(true)
|
|
958
|
+
|
|
959
|
+
// Verify no valid option is selected (placeholder should be selected internally,
|
|
960
|
+
// but render should show placeholder text)
|
|
961
|
+
const selectedValues = slim.getSelected()
|
|
962
|
+
// If placeholder is selected, getSelected() might return empty or the placeholder value
|
|
963
|
+
// The key is that no valid option value is selected
|
|
964
|
+
const hasValidOptionSelected = selectedValues.some((val) => val !== '' && ['opt1', 'opt2', 'opt3'].includes(val))
|
|
965
|
+
expect(hasValidOptionSelected).toBe(false)
|
|
966
|
+
|
|
967
|
+
// The key test: v-model should still have the invalid value
|
|
968
|
+
// but SlimSelect should show placeholder, not the first option
|
|
969
|
+
expect((wrapper.vm as any).selected).toBe('banana')
|
|
970
|
+
})
|
|
971
|
+
|
|
972
|
+
test('should show placeholder when v-model value changes to invalid value', async () => {
|
|
973
|
+
// Test scenario: Start with valid value, then change to invalid value
|
|
974
|
+
const TestComponent = {
|
|
975
|
+
components: { SlimSelectVue },
|
|
976
|
+
template: `
|
|
977
|
+
<SlimSelectVue v-model="selected">
|
|
978
|
+
<option value="opt1">Option 1</option>
|
|
979
|
+
<option value="opt2">Option 2</option>
|
|
980
|
+
<option value="opt3">Option 3</option>
|
|
981
|
+
</SlimSelectVue>
|
|
982
|
+
`,
|
|
983
|
+
data() {
|
|
984
|
+
return {
|
|
985
|
+
selected: 'opt1' as string
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
wrapper = mount(TestComponent)
|
|
991
|
+
await nextTick()
|
|
992
|
+
|
|
993
|
+
const slimComponent = wrapper.findComponent(SlimSelectVue)
|
|
994
|
+
const slim = (slimComponent.vm as any).slim as SlimSelect
|
|
995
|
+
|
|
996
|
+
// Verify initial valid selection
|
|
997
|
+
expect((wrapper.vm as any).selected).toBe('opt1')
|
|
998
|
+
expect(slim.getSelected()).toEqual(['opt1'])
|
|
999
|
+
|
|
1000
|
+
// Change to invalid value
|
|
1001
|
+
;(wrapper.vm as any).selected = 'invalid-value'
|
|
1002
|
+
await nextTick()
|
|
1003
|
+
|
|
1004
|
+
// Verify v-model has invalid value
|
|
1005
|
+
expect((wrapper.vm as any).selected).toBe('invalid-value')
|
|
1006
|
+
|
|
1007
|
+
// Verify placeholder exists
|
|
1008
|
+
const data = slim.getData()
|
|
1009
|
+
const hasPlaceholder = (data as Option[]).some((opt: any) => opt.placeholder)
|
|
1010
|
+
expect(hasPlaceholder).toBe(true)
|
|
1011
|
+
|
|
1012
|
+
// Verify no valid option is selected
|
|
1013
|
+
const selectedValues = slim.getSelected()
|
|
1014
|
+
const hasValidOptionSelected = selectedValues.some((val) => val !== '' && ['opt1', 'opt2', 'opt3'].includes(val))
|
|
1015
|
+
expect(hasValidOptionSelected).toBe(false)
|
|
1016
|
+
})
|
|
1017
|
+
|
|
1018
|
+
test('should show placeholder when v-model is empty string and no placeholder option exists', async () => {
|
|
1019
|
+
// Test scenario: Empty v-model, no placeholder in options initially
|
|
1020
|
+
const TestComponent = {
|
|
1021
|
+
components: { SlimSelectVue },
|
|
1022
|
+
template: `
|
|
1023
|
+
<SlimSelectVue v-model="selected">
|
|
1024
|
+
<option value="opt1">Option 1</option>
|
|
1025
|
+
<option value="opt2">Option 2</option>
|
|
1026
|
+
<option value="opt3">Option 3</option>
|
|
1027
|
+
</SlimSelectVue>
|
|
1028
|
+
`,
|
|
1029
|
+
data() {
|
|
1030
|
+
return {
|
|
1031
|
+
selected: '' as string
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
wrapper = mount(TestComponent)
|
|
1037
|
+
await nextTick()
|
|
1038
|
+
|
|
1039
|
+
const slimComponent = wrapper.findComponent(SlimSelectVue)
|
|
1040
|
+
const slim = (slimComponent.vm as any).slim as SlimSelect
|
|
1041
|
+
|
|
1042
|
+
// Verify v-model is empty
|
|
1043
|
+
expect((wrapper.vm as any).selected).toBe('')
|
|
1044
|
+
|
|
1045
|
+
// Verify placeholder was added
|
|
1046
|
+
const data = slim.getData()
|
|
1047
|
+
const hasPlaceholder = (data as Option[]).some((opt: any) => opt.placeholder)
|
|
1048
|
+
expect(hasPlaceholder).toBe(true)
|
|
1049
|
+
|
|
1050
|
+
// Verify no valid option is selected
|
|
1051
|
+
const selectedValues = slim.getSelected()
|
|
1052
|
+
const hasValidOptionSelected = selectedValues.some((val) => val !== '' && ['opt1', 'opt2', 'opt3'].includes(val))
|
|
1053
|
+
expect(hasValidOptionSelected).toBe(false)
|
|
1054
|
+
})
|
|
1055
|
+
|
|
1056
|
+
test('should update v-model for multiple select when invalid values are provided', async () => {
|
|
1057
|
+
// Test scenario: Multiple select with v-model containing invalid values
|
|
1058
|
+
const TestComponent = {
|
|
1059
|
+
components: { SlimSelectVue },
|
|
1060
|
+
template: `
|
|
1061
|
+
<SlimSelectVue v-model="selected" multiple>
|
|
1062
|
+
<option value="opt1">Option 1</option>
|
|
1063
|
+
<option value="opt2">Option 2</option>
|
|
1064
|
+
<option value="opt3">Option 3</option>
|
|
1065
|
+
</SlimSelectVue>
|
|
1066
|
+
`,
|
|
1067
|
+
data() {
|
|
1068
|
+
return {
|
|
1069
|
+
selected: ['banana', 'apple'] as string[] // Values that don't exist in options
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
wrapper = mount(TestComponent)
|
|
1075
|
+
await nextTick()
|
|
1076
|
+
|
|
1077
|
+
const slimComponent = wrapper.findComponent(SlimSelectVue)
|
|
1078
|
+
const slim = (slimComponent.vm as any).slim as SlimSelect
|
|
1079
|
+
|
|
1080
|
+
// Verify SlimSelect has the invalid values selected (should work even if invalid)
|
|
1081
|
+
const selectedValues = slim.getSelected()
|
|
1082
|
+
|
|
1083
|
+
// When user manually selects a valid option, v-model should update
|
|
1084
|
+
slim.setSelected(['opt1', 'opt2'])
|
|
1085
|
+
await nextTick()
|
|
1086
|
+
|
|
1087
|
+
// Verify v-model has been updated to the valid values
|
|
1088
|
+
expect((wrapper.vm as any).selected).toEqual(['opt1', 'opt2'])
|
|
1089
|
+
})
|
|
1090
|
+
})
|
|
832
1091
|
})
|
|
@@ -59,32 +59,15 @@ export default defineComponent({
|
|
|
59
59
|
config.events = {
|
|
60
60
|
...this.events,
|
|
61
61
|
afterChange: (newVal: Option[]) => {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
// Update v-model if value changed
|
|
65
|
-
if (this.value !== value) {
|
|
66
|
-
this.value = value
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Call the original afterChange callback if it exists
|
|
70
|
-
if (ogAfterChange) {
|
|
71
|
-
ogAfterChange(newVal)
|
|
72
|
-
}
|
|
62
|
+
this.handleAfterChange(newVal, ogAfterChange)
|
|
73
63
|
}
|
|
74
64
|
}
|
|
75
65
|
|
|
76
66
|
// Initialize SlimSelect
|
|
77
67
|
this.slim = new SlimSelect(config)
|
|
78
68
|
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// Check if modelValue is the same as the value of the select
|
|
83
|
-
if (this.value !== selected) {
|
|
84
|
-
// If not, set the value of the select to the modelValue
|
|
85
|
-
// Don't trigger afterChange on initial sync
|
|
86
|
-
this.slim.setSelected(this.value, false)
|
|
87
|
-
}
|
|
69
|
+
// Sync initial modelValue to SlimSelect
|
|
70
|
+
this.syncModelValueToSlimSelect(false)
|
|
88
71
|
},
|
|
89
72
|
updated() {
|
|
90
73
|
// After DOM updates (like slot content changes), sync selection from modelValue
|
|
@@ -95,7 +78,8 @@ export default defineComponent({
|
|
|
95
78
|
const needsSync = JSON.stringify(currentSelected.sort()) !== JSON.stringify(modelValues.sort())
|
|
96
79
|
|
|
97
80
|
if (needsSync) {
|
|
98
|
-
|
|
81
|
+
// Use the same sync method to handle invalid values properly
|
|
82
|
+
this.syncModelValueToSlimSelect(false)
|
|
99
83
|
}
|
|
100
84
|
}
|
|
101
85
|
},
|
|
@@ -108,10 +92,8 @@ export default defineComponent({
|
|
|
108
92
|
modelValue: {
|
|
109
93
|
handler: function (newVal: string | string[] | undefined) {
|
|
110
94
|
if (!this.slim) return
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
// Don't trigger afterChange when programmatically updating from parent
|
|
114
|
-
this.slim.setSelected(this.getCleanValue(newVal), false)
|
|
95
|
+
// Sync modelValue to SlimSelect (don't trigger afterChange when programmatically updating from parent)
|
|
96
|
+
this.syncModelValueToSlimSelect(false)
|
|
115
97
|
}
|
|
116
98
|
},
|
|
117
99
|
data: {
|
|
@@ -138,6 +120,43 @@ export default defineComponent({
|
|
|
138
120
|
getSlimSelect() {
|
|
139
121
|
return this.slim
|
|
140
122
|
},
|
|
123
|
+
handleAfterChange(newVal: Option[], ogAfterChange?: (newVal: Option[]) => void): void {
|
|
124
|
+
if (!this.slim) return
|
|
125
|
+
|
|
126
|
+
const value = this.multiple ? newVal.map((option) => option.value) : newVal.length > 0 ? newVal[0].value : ''
|
|
127
|
+
|
|
128
|
+
// Check if the current v-model value exists in options
|
|
129
|
+
// If it doesn't exist, don't update v-model (preserve invalid value like regular HTML select)
|
|
130
|
+
const currentValue = this.getCleanValue(this.$props.modelValue)
|
|
131
|
+
const options = this.slim.store.getDataOptions()
|
|
132
|
+
const currentValueExists = Array.isArray(currentValue)
|
|
133
|
+
? currentValue.length > 0 && currentValue.every((val) => options.some((opt) => opt.value === val))
|
|
134
|
+
: currentValue !== '' && options.some((opt) => opt.value === currentValue)
|
|
135
|
+
|
|
136
|
+
// Check if the new value is valid (exists in options)
|
|
137
|
+
const newValueIsValid = Array.isArray(value)
|
|
138
|
+
? value.length > 0 && value.every((val) => options.some((opt) => opt.value === val))
|
|
139
|
+
: value !== '' && options.some((opt) => opt.value === value)
|
|
140
|
+
|
|
141
|
+
// Check if value actually changed (properly compare arrays)
|
|
142
|
+
const valueChanged =
|
|
143
|
+
Array.isArray(value) && Array.isArray(this.value)
|
|
144
|
+
? JSON.stringify(value.sort()) !== JSON.stringify(this.value.sort())
|
|
145
|
+
: this.value !== value
|
|
146
|
+
|
|
147
|
+
// Only update v-model if:
|
|
148
|
+
// 1. The value actually changed, AND
|
|
149
|
+
// 2. Either the current v-model value exists in options, OR we're setting to a valid non-empty value
|
|
150
|
+
// This prevents clearing invalid v-model values when we show placeholder
|
|
151
|
+
if (valueChanged && (currentValueExists || newValueIsValid)) {
|
|
152
|
+
this.value = value
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Call the original afterChange callback if it exists
|
|
156
|
+
if (ogAfterChange) {
|
|
157
|
+
ogAfterChange(newVal)
|
|
158
|
+
}
|
|
159
|
+
},
|
|
141
160
|
getCleanValue(val: string | string[] | undefined): string | string[] {
|
|
142
161
|
const multi = this.$props.multiple
|
|
143
162
|
|
|
@@ -152,6 +171,47 @@ export default defineComponent({
|
|
|
152
171
|
}
|
|
153
172
|
|
|
154
173
|
return multi ? [] : ''
|
|
174
|
+
},
|
|
175
|
+
syncModelValueToSlimSelect(runAfterChange: boolean = false): void {
|
|
176
|
+
if (!this.slim) return
|
|
177
|
+
|
|
178
|
+
// Only sync if modelValue is explicitly set (not undefined)
|
|
179
|
+
// This prevents adding placeholders when modelValue is not provided
|
|
180
|
+
if (this.$props.modelValue === undefined) {
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const cleanValue = this.getCleanValue(this.$props.modelValue)
|
|
185
|
+
const data = this.slim.getData()
|
|
186
|
+
// Extract options from data (flatten optgroups if any)
|
|
187
|
+
const options = data.flatMap((item: Option | Optgroup) => ('label' in item ? item.options : [item])) as Option[]
|
|
188
|
+
|
|
189
|
+
// Check if the value exists in options
|
|
190
|
+
const valueExists = Array.isArray(cleanValue)
|
|
191
|
+
? cleanValue.length > 0 && cleanValue.every((val) => options.some((opt) => opt.value === val))
|
|
192
|
+
: cleanValue !== '' && options.some((opt) => opt.value === cleanValue)
|
|
193
|
+
|
|
194
|
+
// If value doesn't exist in options and it's not empty, add a placeholder option
|
|
195
|
+
if (!valueExists) {
|
|
196
|
+
// If its not multiple, add a placeholder option
|
|
197
|
+
if (!Array.isArray(cleanValue)) {
|
|
198
|
+
// For single select, check if placeholder already exists
|
|
199
|
+
const hasPlaceholder = options.some((opt) => opt.placeholder)
|
|
200
|
+
if (!hasPlaceholder) {
|
|
201
|
+
// Get current data and prepend placeholder option
|
|
202
|
+
const currentData = this.slim.getData()
|
|
203
|
+
const placeholderOption: Partial<Option> = {
|
|
204
|
+
value: '',
|
|
205
|
+
text: '',
|
|
206
|
+
placeholder: true
|
|
207
|
+
}
|
|
208
|
+
this.slim.setData([placeholderOption].concat(currentData))
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Set the selected value (will select placeholder if it was just added)
|
|
214
|
+
this.slim.setSelected(cleanValue, runAfterChange)
|
|
155
215
|
}
|
|
156
216
|
}
|
|
157
217
|
})
|
package/vitest.config.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { defineConfig } from 'vitest/config'
|
|
2
2
|
import vue from '@vitejs/plugin-vue'
|
|
3
|
+
import react from '@vitejs/plugin-react'
|
|
3
4
|
import path from 'path'
|
|
4
5
|
|
|
5
6
|
export default defineConfig({
|
|
6
|
-
plugins: [vue()],
|
|
7
|
+
plugins: [vue(), react()],
|
|
7
8
|
resolve: {
|
|
8
9
|
alias: {
|
|
9
10
|
'@': path.resolve(__dirname, 'src')
|
|
@@ -12,7 +13,7 @@ export default defineConfig({
|
|
|
12
13
|
test: {
|
|
13
14
|
globals: true,
|
|
14
15
|
environment: 'jsdom',
|
|
15
|
-
include: ['src/**/*.test.ts'],
|
|
16
|
+
include: ['src/**/*.test.{ts,tsx}'],
|
|
16
17
|
coverage: {
|
|
17
18
|
provider: 'v8',
|
|
18
19
|
reporter: ['text', 'json', 'html', 'lcov'],
|