vue-instantsearch 4.4.0 → 4.5.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.
Files changed (149) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/package.json +4 -4
  3. package/src/components/Breadcrumb.vue +1 -3
  4. package/src/components/ClearRefinements.vue +1 -3
  5. package/src/components/CurrentRefinements.vue +1 -4
  6. package/src/components/HierarchicalMenu.vue +3 -11
  7. package/src/components/HitsPerPage.vue +2 -3
  8. package/src/components/Menu.vue +1 -3
  9. package/src/components/MenuSelect.vue +1 -3
  10. package/src/components/NumericMenu.vue +3 -8
  11. package/src/components/Pagination.vue +1 -3
  12. package/src/components/RangeInput.vue +3 -11
  13. package/src/components/RatingMenu.vue +2 -3
  14. package/src/components/RefinementList.vue +1 -3
  15. package/src/components/SearchBox.vue +18 -0
  16. package/src/components/SearchInput.vue +3 -0
  17. package/src/components/SortBy.vue +2 -3
  18. package/src/components/ToggleRefinement.vue +3 -10
  19. package/src/components/VoiceSearch.vue +10 -0
  20. package/src/components/__tests__/Breadcrumb.js +0 -25
  21. package/src/components/__tests__/ClearRefinements.js +0 -23
  22. package/src/components/__tests__/CurrentRefinements.js +0 -17
  23. package/src/components/__tests__/HierarchicalMenu.js +3 -19
  24. package/src/components/__tests__/HitsPerPage.js +0 -26
  25. package/src/components/__tests__/Menu.js +0 -22
  26. package/src/components/__tests__/MenuSelect.js +0 -23
  27. package/src/components/__tests__/NumericMenu.js +3 -25
  28. package/src/components/__tests__/Pagination.js +0 -21
  29. package/src/components/__tests__/RangeInput.js +1 -34
  30. package/src/components/__tests__/RatingMenu.js +0 -23
  31. package/src/components/__tests__/RefinementList.js +0 -23
  32. package/src/components/__tests__/SearchBox.js +15 -0
  33. package/src/components/__tests__/SortBy.js +1 -23
  34. package/src/components/__tests__/ToggleRefinement.js +4 -33
  35. package/src/mixins/__mocks__/panel.js +1 -5
  36. package/src/mixins/__tests__/panel.test.js +18 -40
  37. package/src/mixins/panel.js +3 -1
  38. package/src/util/createServerRootMixin.js +10 -1
  39. package/vue2/cjs/index.js +1 -1
  40. package/vue2/cjs/index.js.map +1 -1
  41. package/vue2/es/package.json.js +1 -1
  42. package/vue2/es/src/components/Breadcrumb.vue.js +1 -1
  43. package/vue2/es/src/components/Breadcrumb.vue.js.map +1 -1
  44. package/vue2/es/src/components/ClearRefinements.vue.js +1 -1
  45. package/vue2/es/src/components/ClearRefinements.vue.js.map +1 -1
  46. package/vue2/es/src/components/CurrentRefinements.vue.js +1 -1
  47. package/vue2/es/src/components/CurrentRefinements.vue.js.map +1 -1
  48. package/vue2/es/src/components/HierarchicalMenu.vue.js +1 -1
  49. package/vue2/es/src/components/HierarchicalMenu.vue.js.map +1 -1
  50. package/vue2/es/src/components/HitsPerPage.vue.js +1 -1
  51. package/vue2/es/src/components/HitsPerPage.vue.js.map +1 -1
  52. package/vue2/es/src/components/Menu.vue.js +1 -1
  53. package/vue2/es/src/components/Menu.vue.js.map +1 -1
  54. package/vue2/es/src/components/MenuSelect.vue.js +1 -1
  55. package/vue2/es/src/components/MenuSelect.vue.js.map +1 -1
  56. package/vue2/es/src/components/NumericMenu.vue.js +1 -1
  57. package/vue2/es/src/components/NumericMenu.vue.js.map +1 -1
  58. package/vue2/es/src/components/Pagination.vue.js +1 -1
  59. package/vue2/es/src/components/Pagination.vue.js.map +1 -1
  60. package/vue2/es/src/components/RangeInput.vue.js +1 -1
  61. package/vue2/es/src/components/RangeInput.vue.js.map +1 -1
  62. package/vue2/es/src/components/RatingMenu.vue.js +1 -1
  63. package/vue2/es/src/components/RatingMenu.vue.js.map +1 -1
  64. package/vue2/es/src/components/RefinementList.vue.js +1 -1
  65. package/vue2/es/src/components/RefinementList.vue.js.map +1 -1
  66. package/vue2/es/src/components/SearchBox.vue.js +1 -1
  67. package/vue2/es/src/components/SearchBox.vue.js.map +1 -1
  68. package/vue2/es/src/components/SearchInput.vue.js +1 -1
  69. package/vue2/es/src/components/SearchInput.vue.js.map +1 -1
  70. package/vue2/es/src/components/SortBy.vue.js +1 -1
  71. package/vue2/es/src/components/SortBy.vue.js.map +1 -1
  72. package/vue2/es/src/components/ToggleRefinement.vue.js +1 -1
  73. package/vue2/es/src/components/ToggleRefinement.vue.js.map +1 -1
  74. package/vue2/es/src/components/VoiceSearch.vue.js +1 -1
  75. package/vue2/es/src/components/VoiceSearch.vue.js.map +1 -1
  76. package/vue2/es/src/mixins/panel.js +1 -1
  77. package/vue2/es/src/mixins/panel.js.map +1 -1
  78. package/vue2/es/src/util/createServerRootMixin.js +1 -1
  79. package/vue2/es/src/util/createServerRootMixin.js.map +1 -1
  80. package/vue2/umd/index.js +1 -1
  81. package/vue2/umd/index.js.map +1 -1
  82. package/vue3/cjs/index.js +1 -1
  83. package/vue3/cjs/index.js.map +1 -1
  84. package/vue3/es/package.json.js +1 -1
  85. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js +1 -1
  86. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js.map +1 -1
  87. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=6f46de9a&lang.js.map +1 -1
  88. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js +1 -1
  89. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js.map +1 -1
  90. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=410a3aaa&lang.js.map +1 -1
  91. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js +1 -1
  92. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js.map +1 -1
  93. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=4f1917ff&lang.js.map +1 -1
  94. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js +1 -1
  95. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js.map +1 -1
  96. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js +1 -1
  97. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js.map +1 -1
  98. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js +1 -1
  99. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js.map +1 -1
  100. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js +1 -1
  101. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js.map +1 -1
  102. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js +1 -1
  103. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js.map +1 -1
  104. package/vue3/es/src/components/Menu.vue_vue&type=template&id=9bcc0be2&lang.js.map +1 -1
  105. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js +1 -1
  106. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js.map +1 -1
  107. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=694477eb&lang.js.map +1 -1
  108. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js +1 -1
  109. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js.map +1 -1
  110. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js +1 -1
  111. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js.map +1 -1
  112. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js +1 -1
  113. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js.map +1 -1
  114. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=849a166c&lang.js.map +1 -1
  115. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js +1 -1
  116. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js.map +1 -1
  117. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js +1 -1
  118. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js.map +1 -1
  119. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js +1 -1
  120. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js.map +1 -1
  121. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js +1 -1
  122. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js.map +1 -1
  123. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js +1 -1
  124. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js.map +1 -1
  125. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=28927239&lang.js.map +1 -1
  126. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js +1 -1
  127. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js.map +1 -1
  128. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=27029d83&lang.js +1 -1
  129. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=27029d83&lang.js.map +1 -1
  130. package/vue3/es/src/components/SearchInput.vue_vue&type=script&lang.js +1 -1
  131. package/vue3/es/src/components/SearchInput.vue_vue&type=script&lang.js.map +1 -1
  132. package/vue3/es/src/components/SearchInput.vue_vue&type=template&id=2eed8ffc&lang.js.map +1 -1
  133. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js +1 -1
  134. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js.map +1 -1
  135. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js +1 -1
  136. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js.map +1 -1
  137. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js +1 -1
  138. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js.map +1 -1
  139. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js +1 -1
  140. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js.map +1 -1
  141. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js +1 -1
  142. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js.map +1 -1
  143. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=24b0f67a&lang.js.map +1 -1
  144. package/vue3/es/src/mixins/panel.js +1 -1
  145. package/vue3/es/src/mixins/panel.js.map +1 -1
  146. package/vue3/es/src/util/createServerRootMixin.js +1 -1
  147. package/vue3/es/src/util/createServerRootMixin.js.map +1 -1
  148. package/vue3/umd/index.js +1 -1
  149. package/vue3/umd/index.js.map +1 -1
@@ -201,29 +201,6 @@ describe('default render', () => {
201
201
  });
202
202
  });
203
203
 
204
- it('calls the Panel mixin with `canRefine`', async () => {
205
- __setState({ ...defaultState });
206
-
207
- const wrapper = mount(MenuSelect, {
208
- propsData: defaultProps,
209
- });
210
-
211
- const mapStateToCanRefine = () =>
212
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
213
-
214
- expect(mapStateToCanRefine()).toBe(true);
215
-
216
- await wrapper.setData({
217
- state: {
218
- canRefine: false,
219
- },
220
- });
221
-
222
- expect(mapStateToCanRefine()).toBe(false);
223
-
224
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
225
- });
226
-
227
204
  it('exposes send-event method for insights middleware', async () => {
228
205
  const sendEvent = jest.fn();
229
206
  __setState({
@@ -41,6 +41,7 @@ const moreThan500 = {
41
41
  const defaultState = {
42
42
  items: [all, lessThan10, from10to100, from100to500, moreThan500],
43
43
  hasNoResults: false,
44
+ canRefine: true,
44
45
  createURL: () => {},
45
46
  refine: () => {},
46
47
  };
@@ -125,7 +126,7 @@ describe('default render', () => {
125
126
  it('renders correctly without refinement', () => {
126
127
  __setState({
127
128
  ...defaultState,
128
- hasNoResults: true,
129
+ canRefine: false,
129
130
  });
130
131
 
131
132
  const props = {
@@ -190,29 +191,6 @@ describe('default render', () => {
190
191
  });
191
192
  });
192
193
 
193
- it('calls the Panel mixin with `hasNoResults`', async () => {
194
- __setState({ ...defaultState });
195
-
196
- const wrapper = mount(NumericMenu, {
197
- propsData: defaultProps,
198
- });
199
-
200
- const mapStateToCanRefine = () =>
201
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
202
-
203
- expect(mapStateToCanRefine()).toBe(true);
204
-
205
- await wrapper.setData({
206
- state: {
207
- hasNoResults: true,
208
- },
209
- });
210
-
211
- expect(mapStateToCanRefine()).toBe(false);
212
-
213
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
214
- });
215
-
216
194
  it('exposes send-event method for insights middleware', async () => {
217
195
  const sendEvent = jest.fn();
218
196
  __setState({
@@ -281,7 +259,7 @@ describe('custom default render', () => {
281
259
  it('renders correctly without refinement', () => {
282
260
  __setState({
283
261
  ...defaultState,
284
- hasNoResults: true,
262
+ canRefine: false,
285
263
  });
286
264
 
287
265
  const wrapper = mount({
@@ -143,27 +143,6 @@ it('Moves to the previous page on that button', async () => {
143
143
  );
144
144
  });
145
145
 
146
- it('calls the Panel mixin with `nbPages`', async () => {
147
- __setState({ ...defaultState });
148
-
149
- const wrapper = mount(Pagination);
150
-
151
- const mapStateToCanRefine = () =>
152
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
153
-
154
- expect(mapStateToCanRefine()).toBe(true);
155
-
156
- await wrapper.setData({
157
- state: {
158
- nbPages: 1,
159
- },
160
- });
161
-
162
- expect(mapStateToCanRefine()).toBe(false);
163
-
164
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
165
- });
166
-
167
146
  it('implements showFirst', async () => {
168
147
  __setState({ ...defaultState });
169
148
 
@@ -13,6 +13,7 @@ const defaultRange = {
13
13
  const defaultState = {
14
14
  start: [0, 1000],
15
15
  range: defaultRange,
16
+ canRefine: true,
16
17
  refine: () => {},
17
18
  };
18
19
 
@@ -247,40 +248,6 @@ describe('rendering', () => {
247
248
  });
248
249
  });
249
250
 
250
- it('calls the Panel mixin with `range`', async () => {
251
- __setState({
252
- ...defaultState,
253
- range: {
254
- min: 0,
255
- max: 10,
256
- },
257
- });
258
-
259
- const wrapper = mount(RangeInput, {
260
- propsData: {
261
- attribute: 'price',
262
- },
263
- });
264
-
265
- const mapStateToCanRefine = () =>
266
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
267
-
268
- expect(mapStateToCanRefine()).toBe(true);
269
-
270
- await wrapper.setData({
271
- state: {
272
- range: {
273
- min: 0,
274
- max: 0,
275
- },
276
- },
277
- });
278
-
279
- expect(mapStateToCanRefine()).toBe(false);
280
-
281
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
282
- });
283
-
284
251
  it('exposes send-event method for insights middleware', async () => {
285
252
  const sendEvent = jest.fn();
286
253
  __setState({
@@ -126,29 +126,6 @@ it('calls refine when clicked on link', async () => {
126
126
  expect(wrapper.vm.state.refine).toHaveBeenLastCalledWith('1');
127
127
  });
128
128
 
129
- it('calls the Panel mixin with `hasNoResults`', async () => {
130
- __setState({ hasNoResults: false });
131
-
132
- const wrapper = mount(RatingMenu, {
133
- propsData: defaultProps,
134
- });
135
-
136
- const mapStateToCanRefine = () =>
137
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
138
-
139
- expect(mapStateToCanRefine()).toBe(true);
140
-
141
- await wrapper.setData({
142
- state: {
143
- hasNoResults: true,
144
- },
145
- });
146
-
147
- expect(mapStateToCanRefine()).toBe(false);
148
-
149
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
150
- });
151
-
152
129
  it('exposes send-event method for insights middleware', async () => {
153
130
  const sendEvent = jest.fn();
154
131
  __setState({
@@ -166,29 +166,6 @@ it('behaves correctly', async () => {
166
166
  expect(wrapper.vm.state.refine).toHaveBeenLastCalledWith('yo');
167
167
  });
168
168
 
169
- it('calls the Panel mixin with `canRefine`', async () => {
170
- __setState({ ...defaultState });
171
-
172
- const wrapper = mount(RefinementList, {
173
- propsData: { attribute: 'something' },
174
- });
175
-
176
- const mapStateToCanRefine = () =>
177
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
178
-
179
- expect(mapStateToCanRefine()).toBe(true);
180
-
181
- await wrapper.setData({
182
- state: {
183
- canRefine: false,
184
- },
185
- });
186
-
187
- expect(mapStateToCanRefine()).toBe(false);
188
-
189
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
190
- });
191
-
192
169
  it('exposes send-event method for insights middleware', async () => {
193
170
  const sendEvent = jest.fn();
194
171
  __setState({
@@ -147,6 +147,21 @@ test('refine on empty string on form reset', async () => {
147
147
  expect(state.refine).toHaveBeenCalledWith('');
148
148
  });
149
149
 
150
+ test('keep local query when out of sync and input is focused', async () => {
151
+ const state = { ...defaultState, refine: jest.fn() };
152
+ __setState(state);
153
+
154
+ const wrapper = mount(SearchBox, { attachTo: document.body });
155
+ const input = wrapper.find('.ais-SearchBox-input');
156
+ input.element.focus();
157
+ await input.setValue('hello');
158
+
159
+ await wrapper.setData({ state: { query: 'hel' } });
160
+
161
+ expect(input.element.value).toBe('hello');
162
+ expect(state.refine).toHaveBeenLastCalledWith('hello');
163
+ });
164
+
150
165
  test('overriding slots', () => {
151
166
  __setState({
152
167
  ...defaultState,
@@ -12,6 +12,7 @@ const defaultState = {
12
12
  { value: 'some_index_quality', label: 'Quality ascending' },
13
13
  ],
14
14
  hasNoResults: false,
15
+ canRefine: true,
15
16
  currentRefinement: 'some_index',
16
17
  };
17
18
 
@@ -106,26 +107,3 @@ it('calls `refine` when the selection changes with the `value`', async () => {
106
107
  expect(refine).toHaveBeenLastCalledWith('some_index_quality');
107
108
  expect(selectedOption.element.selected).toBe(true);
108
109
  });
109
-
110
- it('calls the Panel mixin with `hasNoResults`', async () => {
111
- __setState({ ...defaultState });
112
-
113
- const wrapper = mount(SortBy, {
114
- propsData: defaultProps,
115
- });
116
-
117
- const mapStateToCanRefine = () =>
118
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
119
-
120
- expect(mapStateToCanRefine()).toBe(true);
121
-
122
- await wrapper.setData({
123
- state: {
124
- hasNoResults: true,
125
- },
126
- });
127
-
128
- expect(mapStateToCanRefine()).toBe(false);
129
-
130
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
131
- });
@@ -13,6 +13,7 @@ const defaultValue = {
13
13
 
14
14
  const defaultState = {
15
15
  value: defaultValue,
16
+ canRefine: true,
16
17
  refine: () => {},
17
18
  createURL: () => {},
18
19
  };
@@ -82,6 +83,7 @@ describe('default render', () => {
82
83
  it('renders correctly without refinement (with 0)', () => {
83
84
  __setState({
84
85
  ...defaultState,
86
+ canRefine: false,
85
87
  value: {
86
88
  ...defaultValue,
87
89
  count: 0,
@@ -98,6 +100,7 @@ describe('default render', () => {
98
100
  it('renders correctly without refinement (with null)', () => {
99
101
  __setState({
100
102
  ...defaultState,
103
+ canRefine: false,
101
104
  value: {
102
105
  ...defaultValue,
103
106
  count: null,
@@ -162,39 +165,6 @@ describe('default render', () => {
162
165
  });
163
166
  });
164
167
 
165
- it('calls the Panel mixin with `value.count`', async () => {
166
- __setState({
167
- ...defaultState,
168
- value: {
169
- // Otherwise setData update the default value
170
- // and impact the other tests. We should not
171
- // rely on a global state for the tests.
172
- ...defaultValue,
173
- },
174
- });
175
-
176
- const wrapper = mount(Toggle, {
177
- propsData: defaultProps,
178
- });
179
-
180
- const mapStateToCanRefine = () =>
181
- wrapper.vm.mapStateToCanRefine(wrapper.vm.state);
182
-
183
- expect(mapStateToCanRefine()).toBe(true);
184
-
185
- await wrapper.setData({
186
- state: {
187
- value: {
188
- count: 0,
189
- },
190
- },
191
- });
192
-
193
- expect(mapStateToCanRefine()).toBe(false);
194
-
195
- expect(wrapper.vm.mapStateToCanRefine({})).toBe(false);
196
- });
197
-
198
168
  it('exposes send-event method for insights middleware', async () => {
199
169
  const sendEvent = jest.fn();
200
170
  __setState({
@@ -255,6 +225,7 @@ describe('custom default render', () => {
255
225
  it('renders correctly without refinement', () => {
256
226
  __setState({
257
227
  ...defaultState,
228
+ canRefine: false,
258
229
  value: {
259
230
  ...defaultValue,
260
231
  count: 0,
@@ -1,7 +1,3 @@
1
1
  export const createPanelProviderMixin = jest.fn(() => ({}));
2
2
 
3
- export const createPanelConsumerMixin = jest.fn(({ mapStateToCanRefine }) => ({
4
- methods: {
5
- mapStateToCanRefine,
6
- },
7
- }));
3
+ export const createPanelConsumerMixin = jest.fn(() => ({}));
@@ -86,18 +86,12 @@ describe('createPanelProviderMixin', () => {
86
86
  });
87
87
 
88
88
  describe('createPanelConsumerMixin', () => {
89
- const mapStateToCanRefine = state => state.attributeName;
90
-
91
- it('emits PANEL_CHANGE_EVENT on `state.attributeName` change', async () => {
89
+ it('emits PANEL_CHANGE_EVENT on `state.canRefine` change', async () => {
92
90
  const emitter = createFakeEmitter();
93
91
  const Test = createFakeComponent();
94
92
 
95
93
  const wrapper = mount(Test, {
96
- mixins: [
97
- createPanelConsumerMixin({
98
- mapStateToCanRefine,
99
- }),
100
- ],
94
+ mixins: [createPanelConsumerMixin()],
101
95
  provide: {
102
96
  [PANEL_EMITTER_NAMESPACE]: emitter,
103
97
  },
@@ -105,7 +99,7 @@ describe('createPanelConsumerMixin', () => {
105
99
 
106
100
  await wrapper.setData({
107
101
  state: {
108
- attributeName: false,
102
+ canRefine: false,
109
103
  },
110
104
  });
111
105
 
@@ -113,7 +107,7 @@ describe('createPanelConsumerMixin', () => {
113
107
  expect(emitter.emit).toHaveBeenLastCalledWith(PANEL_CHANGE_EVENT, false);
114
108
 
115
109
  if (isVue3) {
116
- await wrapper.setData({ state: { attributeName: true } });
110
+ await wrapper.setData({ state: { canRefine: true } });
117
111
  } else {
118
112
  // ↓ this should be replaceable with `wrapper.setData()` but it didn't
119
113
  // trigger the watcher in `createPanelConsumerMixin`.
@@ -121,7 +115,7 @@ describe('createPanelConsumerMixin', () => {
121
115
  // https://github.com/vuejs/vue-test-utils/issues/1756
122
116
  // https://github.com/vuejs/vue-test-utils/issues/149
123
117
  wrapper.vm.$set(wrapper.vm, 'state', {
124
- attributeName: true,
118
+ canRefine: true,
125
119
  });
126
120
  await nextTick();
127
121
  }
@@ -135,11 +129,7 @@ describe('createPanelConsumerMixin', () => {
135
129
  const Test = createFakeComponent();
136
130
 
137
131
  const wrapper = mount(Test, {
138
- mixins: [
139
- createPanelConsumerMixin({
140
- mapStateToCanRefine,
141
- }),
142
- ],
132
+ mixins: [createPanelConsumerMixin()],
143
133
  provide: {
144
134
  [PANEL_EMITTER_NAMESPACE]: emitter,
145
135
  },
@@ -147,7 +137,7 @@ describe('createPanelConsumerMixin', () => {
147
137
 
148
138
  await wrapper.setData({
149
139
  state: {
150
- attributeName: false,
140
+ canRefine: false,
151
141
  },
152
142
  });
153
143
 
@@ -156,7 +146,7 @@ describe('createPanelConsumerMixin', () => {
156
146
 
157
147
  await wrapper.setData({
158
148
  state: {
159
- attributeName: false,
149
+ canRefine: false,
160
150
  },
161
151
  });
162
152
 
@@ -168,11 +158,7 @@ describe('createPanelConsumerMixin', () => {
168
158
  const Test = createFakeComponent();
169
159
 
170
160
  const wrapper = mount(Test, {
171
- mixins: [
172
- createPanelConsumerMixin({
173
- mapStateToCanRefine,
174
- }),
175
- ],
161
+ mixins: [createPanelConsumerMixin()],
176
162
  provide: {
177
163
  [PANEL_EMITTER_NAMESPACE]: emitter,
178
164
  },
@@ -180,7 +166,7 @@ describe('createPanelConsumerMixin', () => {
180
166
 
181
167
  await wrapper.setData({
182
168
  state: {
183
- attributeName: true,
169
+ canRefine: true,
184
170
  },
185
171
  });
186
172
 
@@ -193,11 +179,7 @@ describe('createPanelConsumerMixin', () => {
193
179
  const Test = createFakeComponent();
194
180
 
195
181
  const wrapper = mount(Test, {
196
- mixins: [
197
- createPanelConsumerMixin({
198
- mapStateToCanRefine,
199
- }),
200
- ],
182
+ mixins: [createPanelConsumerMixin()],
201
183
  provide: {
202
184
  [PANEL_EMITTER_NAMESPACE]: emitter,
203
185
  },
@@ -205,7 +187,7 @@ describe('createPanelConsumerMixin', () => {
205
187
 
206
188
  await wrapper.setData({
207
189
  state: {
208
- attributeName: true,
190
+ canRefine: true,
209
191
  },
210
192
  });
211
193
 
@@ -227,11 +209,7 @@ describe('createPanelConsumerMixin', () => {
227
209
  const Test = createFakeComponent();
228
210
 
229
211
  const wrapper = mount(Test, {
230
- mixins: [
231
- createPanelConsumerMixin({
232
- mapStateToCanRefine,
233
- }),
234
- ],
212
+ mixins: [createPanelConsumerMixin()],
235
213
  provide: {
236
214
  [PANEL_EMITTER_NAMESPACE]: emitter,
237
215
  },
@@ -239,7 +217,7 @@ describe('createPanelConsumerMixin', () => {
239
217
 
240
218
  await wrapper.setData({
241
219
  state: {
242
- attributeName: true,
220
+ canRefine: true,
243
221
  },
244
222
  });
245
223
 
@@ -247,9 +225,9 @@ describe('createPanelConsumerMixin', () => {
247
225
  expect(emitter.emit).toHaveBeenLastCalledWith(PANEL_CHANGE_EVENT, true);
248
226
 
249
227
  if (isVue3) {
250
- await wrapper.setData({ state: { attributeName: false } });
228
+ await wrapper.setData({ state: { canRefine: false } });
251
229
  } else {
252
- wrapper.vm.$set(wrapper.vm, 'state', { attributeName: false });
230
+ wrapper.vm.$set(wrapper.vm, 'state', { canRefine: false });
253
231
  await nextTick();
254
232
  }
255
233
 
@@ -257,9 +235,9 @@ describe('createPanelConsumerMixin', () => {
257
235
  expect(emitter.emit).toHaveBeenLastCalledWith(PANEL_CHANGE_EVENT, false);
258
236
 
259
237
  if (isVue3) {
260
- await wrapper.setData({ state: { attributeName: false } });
238
+ await wrapper.setData({ state: { canRefine: false } });
261
239
  } else {
262
- wrapper.vm.$set(wrapper.vm, 'state', { attributeName: false });
240
+ wrapper.vm.$set(wrapper.vm, 'state', { canRefine: false });
263
241
  await nextTick();
264
242
  }
265
243
 
@@ -39,7 +39,9 @@ export const createPanelProviderMixin = () => ({
39
39
  },
40
40
  });
41
41
 
42
- export const createPanelConsumerMixin = ({ mapStateToCanRefine }) => ({
42
+ export const createPanelConsumerMixin = ({
43
+ mapStateToCanRefine = state => Boolean(state.canRefine),
44
+ } = {}) => ({
43
45
  inject: {
44
46
  emitter: {
45
47
  from: PANEL_EMITTER_NAMESPACE,
@@ -105,7 +105,16 @@ function augmentInstantSearch(instantSearchOptions, cloneComponent) {
105
105
  mixins: [
106
106
  {
107
107
  beforeCreate() {
108
- if (component.$nuxt) {
108
+ const descriptor = Object.getOwnPropertyDescriptor(
109
+ component,
110
+ '$nuxt'
111
+ );
112
+
113
+ const isWritable = descriptor
114
+ ? descriptor.writable || descriptor.set
115
+ : false;
116
+
117
+ if (component.$nuxt && isWritable) {
109
118
  // In case of Nuxt (3), we ensure the context is shared between
110
119
  // the real and cloned component
111
120
  this.$nuxt = component.$nuxt;